MySQL引擎類型爲InnoDB的表的鎖問題

關於mysql的innodb的鎖的一點內容:

org.hibernate.exception.LockTimeoutException
Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction


X鎖:排他鎖
S鎖:共享鎖
GAP鎖:間隙鎖
插入意向鎖


MyISAM:只支持表鎖,不支持事務


InnoDB 默認是行鎖,刪除和更新和插入會操縱數據會上鎖(X鎖),查詢不會上鎖。
如果A事務中要執行的SQL語句,並不能確定數據的主鍵,則會鎖住整張表。
如果A事務中要執行的SQL語句,能確定主鍵,則會找到這個數據,數據不存在則不會上鎖。數據存在則會鎖住這一行。
如果B事務中要鎖的數據已經被A事務上鎖,則B事務會等待鎖,若超過默認時間50s,會報lock wait timeout exceeded mysql。


假如id爲主鍵,main_waybill_no非唯一索引,非普通索引
DELETE FROM newest_track WHERE id IN(1,2,3); 會鎖id爲1,2,3的三行數據
DELETE FROM newest_track WHERE id = 1; 會鎖id爲1的一行數據
UPDATE newest_track SET stms_insert_time = NOW() WHERE id = 1; 會鎖id爲1的一行數據
UPDATE newest_track SET stms_insert_time = NOW() WHERE id IN(1,2,3); 會鎖id爲1,2,3的三行數據


DELETE FROM newest_track WHERE main_waybill_no IN (1,2,3); 會鎖表
DELETE FROM newest_track WHERE main_waybill_no = 1; 會鎖表
UPDATE newest_track SET stms_insert_time = NOW() WHERE main_waybill_no = 1; 會鎖表
UPDATE newest_track SET stms_insert_time = NOW() WHERE main_waybill_no IN (1,2,3); 會鎖表


INSERT INTO newest_track VALUES(......); 會鎖新添加的這條數據,如果其他地方要鎖表則會等待
SELECT * FROM newest_track; 不會上鎖


*************
delete from XXX where 索引 = 10 爲索引爲10的添加X鎖,其周圍添加GAP鎖(間隙鎖)
delete from XXX where 非索引 = 10 鎖表S
insert時會在指定位置添加 插入意向間隙鎖,插入意向間隙鎖彼此不衝突,但和其他鎖衝突
當有gap鎖時,insert將等待
X鎖,S鎖,Record鎖,gap鎖,NextKey鎖(Record鎖+gap鎖),插入意向鎖


僅僅是個引子,具體情況具體分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章