mysql優化 - mysql innodb 表鎖,跪求dba大牛,解答
問題描述
問題:1.在innodb中沒有開啟事務而且autocommit=1的情況下,update,delete會不會造成鎖表?
我在終端開啟了兩個mysql會話,表t一共有350萬行數據
單獨執行:
會話1:update t set status=1 where id>1; 16.*秒 會話2:update t set status=1 where id<3500000; 12.*秒
同時執行,我的理解:
**在我看來,這兩條sql,同時執行,同時操作同一條記錄的情況,只有一次****在innodb中update和delete都會隱式添加排它鎖,那么就是說這兩條sql同時執行,只會阻塞很短的時間,畢竟只有同時操作同一條記錄的情況下,才會阻塞**
同時執行,測試結果:
兩條sql,間隔執行時間,在半秒左右.會話1先執行:update t set status=1 where id>1;16.*秒,沒有變化 會話2后執行:update t set status=1 where id<3500000; 28.* = 12.*秒+16.*秒會話2先執行:update t set status=1 where id>1;12.*秒,沒有變化 會話1后執行:update t set status=1 where id<3500000; 28.* = 16.*秒+12.*秒
難道兩條sql,同時操作同一個記錄時,鎖表了?我的理解應該是只會阻塞很短的時間啊,畢竟只有一次同時操作同一條記錄,就好像,兩個人,a從1數到10,b從10數到1,無論是同樣的速度,還是不是一樣的速度,都只可能同時數到相同的數字一次啊
問題解答
回答1:一個sql就是一個事務,并不是說操作了1W條記錄就是1W個事務,sql1鎖住所有>1的記錄,sql2會等待sql1釋放鎖
