經(jīng)過測試之後,我發(fā)現(xiàn)以下情況都會導(dǎo)致表鎖定
1.like
2.update,delete無條件的操作
3.update,delete有條件的操作但不是主鍵的操作
select無論是有條件還是無條件,條件是不是主鍵或索引,都不會鎖定表,請問這是對的嗎?是不是我測試出現(xiàn)了問題?
select 可指定加上各級鎖如共用鎖、排他鎖等,例如select ... FOR UPDATE
。
至於為什麼需要鎖,舉個簡單例子,例如你有個單據(jù)繼承自上個單據(jù),這時候你可以select加讀鎖,鎖定上個單據(jù),來防止其他人在你提交前對上個單據(jù)進行修改,造成數(shù)據(jù)不一致。
只要條件不包含主鍵,或包含主鍵但不是等號或IN,都會鎖全表的,這就包括了問題中全部3種情況。
不管是鎖全表還是鎖幾行,select加讀鎖,update和delete加寫鎖,至於什麼是讀鎖、寫鎖,可谷歌一下。至於細節(jié),還可以看下事務(wù)隔離等級,這裡就不展開了。