成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL中的八種鎖!你知道幾種?

數據庫 MySQL
在雙11期間,支付寶數據庫集群每秒處理25萬筆交易,而支撐這一切的核心技術之一就是MySQL的鎖機制。這篇文章跟大家一起聊聊MySQL的8種鎖,希望對你會有所幫助。

前言

在雙11期間,支付寶數據庫集群每秒處理25萬筆交易,而支撐這一切的核心技術之一就是MySQL的鎖機制。

很多小伙伴在工作中都遇到過這樣的場景:

  • 凌晨批量處理數據時系統突然卡死。
  • 高并發場景下出現詭異的死鎖報錯。
  • 明明只更新一行卻導致全表阻塞。

這篇文章跟大家一起聊聊MySQL的8種鎖,希望對你會有所幫助。

一、鎖的本質:并發控制的基石

1.為什么需要鎖?

當多個事務同時操作同一數據時,可能引發:

  • 臟讀:讀到未提交的數據
  • 不可重復讀:同事務內兩次讀取結果不同
  • 幻讀:同條件查詢出現新記錄

鎖的作用:通過對數據資源加鎖,實現事務的隔離性(ACID中的"I")

二、鎖的分類全景圖

1.按粒度劃分

按粒度劃分為:

  • 表鎖
  • 頁鎖
  • 行鎖

2.按模式劃分

鎖類型

共享性

典型場景

共享鎖(S)

可共享

SELECT ... LOCK IN SHARE MODE

排他鎖(X)

獨占

UPDATE/DELETE/INSERT

意向共享鎖(IS)

表級標記

準備加行級S鎖前

意向排他鎖(IX)

表級標記

準備加行級X鎖前

三、行級鎖:高并發的核心戰場

1.記錄鎖(Record Lock)

鎖定索引記錄:

-- 事務A
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE; -- 對id=1加X鎖

-- 事務B(將被阻塞)
UPDATE users SET name = 'Tom' WHERE id = 1;

底層實現:

2.間隙鎖(Gap Lock)

鎖定索引區間(解決幻讀):

假設當前表結構:id主鍵(當前有id=1,5,10)

BEGIN;
SELECT * FROM users WHERE id BETWEEN 5 AND 10 FOR UPDATE;

-- 阻塞所有[5,10]區間的插入
INSERT INTO users(id) VALUES(6); -- 被阻塞!
INSERT INTO users(id) VALUES(11); -- 成功

鎖定范圍:

3.臨鍵鎖(Next-Key Lock)

記錄鎖+間隙鎖組合:

假設當前數據庫隔離級別是RR(Repeatable Read):

BEGIN;
SELECT * FROM users WHERE id > 5 FOR UPDATE; 

-- 阻塞操作
UPDATE users SET name='A' WHERE id=10; -- 記錄鎖阻塞
INSERT INTO users(id) VALUES(6);     -- 間隙鎖阻塞

鎖范圍示意圖:

四、表級鎖:全表掃描的保護傘

1.表鎖(Table Lock)

顯式加鎖:

LOCK TABLES users WRITE; -- 獲取寫鎖
-- 執行更新...
UNLOCK TABLES;

隱式加鎖(DDL操作自動加鎖):

ALTER TABLE users ADD COLUMN age INT; -- 自動加表級X鎖

2.元數據鎖(MDL)

保護表結構:

-- 會話A
BEGIN;
SELECT * FROM users; -- 獲取MDL讀鎖

-- 會話B(被阻塞)
ALTER TABLE users ADD COLUMN email VARCHAR(255);

等待鏈:

五、死鎖:高并發的終極挑戰

1.經典死鎖場景

-- 事務A
BEGIN;
UPDATE accounts SET balance = balance - 100WHEREid = 1;
UPDATE accounts SET balance = balance + 100WHEREid = 2;

-- 事務B(反向操作)
BEGIN;
UPDATE accounts SET balance = balance - 100WHEREid = 2;
UPDATE accounts SET balance = balance + 100WHEREid = 1;

死鎖形成過程:

2.死鎖檢測與解決

自動檢測:

SHOW ENGINE INNODB STATUS; 
-- 查看LATEST DETECTED DEADLOCK

手動處理:

// Spring事務重試
@Retryable(maxAttempts = 3, backoff = @Backoff(delay = 100))
@Transactional
public void transferMoney(Long from, Long to, BigDecimal amount) {
    // 轉賬邏輯
}

六、鎖監控與優化實戰

1.鎖等待分析

-- 查看鎖等待
SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;

2.索引優化避免全表鎖

問題SQL:

UPDATE users SET status=1 WHERE name LIKE 'A%'; -- 無索引導致表鎖

優化方案:

ALTER TABLE users ADD INDEX idx_name(name); -- 創建索引
UPDATE users SET status=1 WHERE name LIKE 'A%'; -- 僅加行鎖

3.鎖超時配置

# my.cnf
[mysqld]
innodb_lock_wait_timeout=50  # 默認50秒

七、不同隔離級別的鎖差異

隔離級別

臟讀

不可重復讀

幻讀

鎖機制

讀未提交(Read Uncommitted)

可能

可能

可能

不加鎖

讀已提交(Read Committed)

不可能

可能

可能

語句級快照

可重復讀(Repeatable Read)

不可能

不可能

可能(*)

臨鍵鎖(默認)

串行化(Serializable)

不可能

不可能

不可能

全表鎖

InnoDB在RR級別通過Next-Key Lock解決幻讀問題。

八、鎖機制最佳實踐

1. 鎖優化口訣

  • 一快:事務執行要快。
  • 二小:鎖粒度盡量小。
  • 三避免:避免大事務、全表掃描、長等待 。

2. 不同場景鎖選擇

場景

推薦方案

精確更新單行

行級X鎖(WHERE主鍵)

范圍更新

Next-Key Lock(RR隔離級別)

全表更新

分批提交+低峰期執行

結構變更

PT-Online-Schema-Change工具

總結

  • 鎖是雙刃劍:保護數據一致性的同時降低并發度
  • 粒度決定性能:行鎖 > 頁鎖 > 表鎖
  • 隔離級別是基礎:根據業務選擇合適級別(推薦RR)
  • 索引是鑰匙:80%的鎖問題可通過優化索引解決
  • 監控是眼睛:善用SHOW ENGINE INNODB STATUS

正如數據庫專家Michael Stonebraker所言:“The best locking strategy is no locking at all.”

最高明的鎖策略是“無鎖”,而這正是我們不斷優化的方向。

責任編輯:姜華 來源: 蘇三說技術
相關推薦

2024-08-01 09:58:33

API性能機制

2024-04-28 14:49:31

2020-11-16 09:15:07

MYSQL

2021-08-05 07:28:25

Java實現方式

2021-03-03 00:01:30

Redis數據結雙向鏈表

2019-09-02 11:14:08

隔離虛擬機操作系統

2021-05-07 16:19:36

異步編程Java線程

2025-01-21 10:04:40

Java并發阻塞隊列

2023-10-30 11:53:37

繼承JS父類

2025-04-17 07:10:03

API架構項目

2022-05-27 06:57:50

Python循環方式生成器

2022-02-10 08:57:45

分布式線程鎖

2024-11-04 09:39:08

Java?接口Thread?類

2024-04-24 11:24:43

C#數據去重

2019-12-02 10:16:46

架構設計模式

2022-06-29 08:32:04

游標MySQL服務器

2022-08-11 08:46:23

索引數據結構

2024-05-10 07:44:23

C#進程程序

2024-09-20 08:04:54

2023-12-27 12:12:35

NumPy函數數組
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天干狠狠干 | 日韩精品一区二区三区第95 | 久久手机在线视频 | 羞羞的视频在线 | 99热精品在线观看 | 欧一区二区 | 国产一区三区视频 | 国产成在线观看免费视频 | 久久久精品一区二区三区 | 手机在线观看 | 亚洲香蕉| 欧美精品 在线观看 | 欧美日韩第一页 | 久草网址| 欧美一级黄色免费看 | 欧美性猛交一区二区三区精品 | 日本成人在线网址 | 福利精品在线观看 | 精品1区2区3区 | 九一国产精品 | 久久国产精品久久久久久 | 91视频一区二区三区 | 中文字幕久久精品 | 日韩精品色网 | 国产成人精品一区二区三区四区 | 精品国产伦一区二区三区观看体验 | 国产欧美精品一区二区三区 | 国产性色视频 | 日韩电影一区二区三区 | 亚洲一区二区电影网 | 91亚洲国产成人久久精品网站 | 日韩中文字幕在线观看 | 亚洲国产成人精品在线 | 亚洲综合无码一区二区 | 成人在线观看欧美 | 二区亚洲| 一区二区三区国产视频 | 亚洲一区欧美一区 | 国产欧美精品一区二区色综合 | 国产精品毛片久久久久久久 | 亚洲精品第一 |