回滾機制 MysqlInnoDB 鎖機制及測試

2021-10-25 13:03:41 字數 3648 閱讀 2514

1. 死鎖

1.1 死鎖概念:

死鎖是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產 生了死鎖,這些永遠在互相等待的程序稱為死鎖程序.表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的innodb

1.2 mysql處理死鎖的方式

等待,直到超時(innodb_lock_wait_timeout=50s)。

發起死鎖檢測,主動回滾一條事務,讓其他事務繼續執行(innodb_deadlock_detect=on)。

1.3 死鎖檢測

死鎖檢測的原理是構建乙個以事務為頂點、鎖為邊的有向圖,判斷有向圖是否存在環,存在即有死鎖。

1.4 回滾機制

檢測到死鎖之後,選擇插入更新或者刪除的行數最少的事務回滾,基於 information_schema.innodb_trx 表中的 trx_weight 欄位來判斷。如果插入更新或者刪除的行數一樣則回滾後面執行的那條事務。

1.5 測試表及資料:下面不再展示

【p_transaction 表】

id  int(11) no  pri     auto_incrementcount   int(11) yes         version int(11) yes     0   ---id  count   version1   1   16   11  010  14  011  14  012  10  013  15  014  16  015  17  016  18  021  22  024  24  025  25  026  26  027  27  028  28  029  29  030  300 031  301 0
1.6 測試用例

-- 檢視日誌檔案設定狀態show variables like "%innodb_flush_log_at_trx_commit%";-- 更改日誌檔案設定狀態set @@global.innodb_flush_log_at_trx_commit = 0; -- 0,1,2 -- 鎖等待時間show variables like "%innodb_lock_wait_timeout%";-- 死鎖自動回滾show variables like "%innodb_deadlock_detect%"; -- 死鎖測試begin;select * from p_transaction where id = 32 for update;update p_transaction set count = 1 where id = 1;insert into p_transaction (id, count) values (32, 300);commit;rollback;
2. mvcc 樂觀鎖2.1 英文全稱為multi-version concurrency control,翻譯為中文即「多版本併發控制」。mvcc使得innodb的事務隔離級別下執行一致性讀操作有了保證,換言之,就是 為了查詢一些正在被另乙個事務更新的行, 並且可以看到它們被更新之前的值。這是乙個可以用來增強併發性的強大的技術,因為這樣一來的話查詢就不用等 待另乙個事務釋放鎖。這項技術在資料庫領域並不是普遍使用的。一些其它的資料庫產品, 以及mysql其它的儲存引擎並不支援它。

2.2 mysql的innodb表除了實際的資料之外,還會加上3個隱藏的字段,如下:

實際資料 | create_no(建立版本號或者建立時間) | update_no(每次修改的版本號或者修改時間) | delete_no(刪除版本號或者刪除時間)

2.3 mvcc是樂觀鎖的一種實現方式,但並不是mvcc就等於樂觀鎖。

2.4 測試用例

-- 樂觀鎖測試select count, version  from p_transaction where id = 1;update p_transaction set count = count - 1,version = version + 1 where id = 1 and version = 0;
3. 樂觀鎖與悲觀鎖:樂觀鎖與悲觀鎖都屬於是一種思想,而非實際的 mysql 鎖機制。3.1 測試用例

-- 悲觀鎖測試begin;select count from p_transaction where id = 1;update p_transaction set count = count - 1 where id = 1;commit;rollback;
4. 間隙鎖當我們用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內但不存在的 記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(next-key)鎖。間隙鎖類次與頁級鎖,但是實際是行級鎖。

4.1 測試用例

-- 悲觀鎖測試begin;select count from p_transaction where id = 1;update p_transaction set count = count - 1 where id = 1;commit;rollback;
5. 行級鎖公升級為表級鎖innodb 行級鎖是通過給索引上的索引項加鎖來實現的,innodb行級鎖只有通過索引條件檢索資料,才使用行級鎖;否則,innodb使用表鎖 在不通過索引(主 鍵)條件查詢的時候,innodb是表鎖而不是行鎖。

5.1 測試用例

-- 間隙鎖測試begin;select * from p_transaction where id >=1 and id <= 10 for update;select * from p_transaction where id between 1 and 10 for update;-- 排它鎖select * from p_transaction where id = 6 for update;-- 共享鎖select * from p_transaction where id = 6 lock in share mode;-- 無鎖select * from p_transaction where id = 6;update p_transaction set count = 10 where id = 6;update p_transaction set count = 10 where id = 12;commit;rollback;
6. 事務的使用建議

歲月崢嶸

不忘初心

平庸懶惰

不求上進

mysql回滾命令 關於MySQL回滾機制

在事務中,每個正確的原子操作都會被順序執行,直到遇到錯誤的原子操作,此時事務會將之前的操作進行回滾。回滾的意思是如果之前是插入操作,那麼會執行刪 除插入的記錄,如果之前是update操作,也會執行update操作將之前的記錄還原 因此,正確的原子操作是真正被執行過的。是物理執行。在當前事務中確實能看...

Spring事務回滾機制

為什麼不會滾呢?是對spring的事務機制就不明白。預設spring事務只在發生未 獲的 runtimeexcetpion時才回滾。spring aop 異常捕獲原理 被攔截的方法需顯式丟擲異常,並不能經任何處理,這樣aop 才能捕獲到方法的異常,才能進行回滾,預設情況下aop只捕獲runtimee...

事務日誌回滾機制研究

摘要 隔離級別的概念 企業級的資料庫每一秒鐘都可能應付成千上萬的併發訪問,因而帶來了併發控制的問題。由資料庫理論可知,由於併發訪問,在不可預料的時刻可能引發如下幾個可以預料的問題 髒讀 包含未提交資料的讀取。例如,事務1 更改了某行。事務2 在事務1 提交更改之前讀取已更改的行。如果事務1 回滾更改...