關於mysql的innodb的鎖的一點內容:
org.hibernate.exception.LockTimeoutExceptionCaused 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鎖),插入意向鎖
僅僅是個引子,具體情況具體分析。