當有多個事務同時更新一條sql時,mysql是如何處理的呢?很顯然,使用加鎖的方式,一個事務獲得了鎖,進行操作,其他事務排隊一個個等着,等當前這個事務執行完釋放鎖,其他事務獲取鎖取到鎖的進行操作。這里的鎖就是獨占鎖,也就是X鎖。
那么如果有查詢這一行數據時,是要加鎖嗎?不是的,mysql為了提高性能,讀的時候使用mvcc機制,通過ReadView,查詢undo log版本鏈,獲取到自己能查詢到的版本數據。讀與更新同時進行,不互斥,性能就提高了。
共享鎖又是什么呢?mysql里叫共享鎖為S鎖,通 過手動執行select * from table lock in share mode來加共享鎖。加了共享鎖,還能加獨占鎖嗎?不能的,共享鎖和獨占鎖是互斥的。不過共享鎖和共享鎖不互斥,也就是加了一個共享鎖,還可以再加另一個共享鎖。
獨占鎖 | 共享鎖 | |
獨占鎖 | 互斥 | 互斥 |
共享鎖 | 互斥 | 不互斥 |
但平時我們是很少去手動加共享鎖的,一般更新時加獨占鎖就夠了。 另外執行select * from table for update也會加獨占鎖。