mysql的innodb引擎事務有4種隔離級別,主要是為了保證資料的一致性。
innodb引擎提供了行級鎖,表鎖。myisam提供了表鎖,如題,mysql會發生死鎖嗎?
答會,在innodb引擎下,rr(repeatable-read)級別,如果多個事務爭搶同乙個資源,會發生死鎖。在rr級別下,mysql提供了next-key lock。假如乙個索引的行有10,11,13,20
那麼可能的next-key lock的包括:
(無窮小, 10]
(10,11]
(11,13]
(13,20]
(20, 無窮大)
即:當你查詢12時,如果資料未查到,那麼將對(12,13]範圍內的資料進行鎖定。next-key lock的定義可以到官方具體檢視,這裡做個演示。
//檢視隔離級別,
show variables like '%tx_isolation%';
// 設定隔離界別
set [session | global] transaction isolation level
// 不設定自動提交
set autocommit = 0;
死鎖演示
首先將隔離級別都設定為rr級別的,並且不讓事務自動提交
根據上面的資料,在事務1中查詢
// 得到空結果集,此時鎖定的範圍是(33,100]
select * from user where id=33 for update;
在事務2中也進行查詢
// 查詢到空的結果,在事務2中鎖定的範圍是(34,100]
select * from user where id=34 for update
在事務1中插入資料
// 雖然事務1鎖定了範圍,事務2也鎖定了範圍
在事務2中也插入資料
可以發現已經發生了死鎖
解決辦法
設定死鎖的超時時長
innodb_lock_wait_timeout=500
查詢到當前正在鎖定的事務執行緒,將其殺死
// 可以看到正在執行的事務執行緒,還有執行狀態
select * from information_schema.innodb_trx;
//trx_mysql_thread_id為上一條命令獲取的結果,將具體的數字替換一下即可。
kill trx_mysql_thread_id
MySql產生死鎖
資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有衝...
什麼是死鎖,為什麼會產生死鎖?
死鎖 每個人都擁有其他人需要的資源,同時又等待其他人擁有的資源,並且每個人在獲得所有需要的資源之前都不會放棄已經擁有的資源。當多個執行緒完成功能需要同時獲取多個共享資源的時候可能會導致死鎖。死鎖的條件 1兩個以上的執行緒 2至少兩個鎖以上 3同步中巢狀同步 男孩 public class boyex...
產生死鎖的原因
產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則 就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。產生死鎖的四個必要條件 1 互斥條件 乙個資源...