解釋:
for update是在數(shù)據(jù)庫(kù)中上鎖用的,可以為數(shù)據(jù)庫(kù)中的行上一個(gè)排它鎖。當(dāng)一個(gè)事務(wù)的操作未完成時(shí)候,其他事務(wù)可以讀取但是不能寫入或更新。
例子:
比如一張表三個(gè)字段 , id(商品id), name(商品名字) , count(數(shù)量)
當(dāng)商品搶購(gòu)時(shí)候會(huì)顯示剩余商品件數(shù),如果并發(fā)量大的時(shí)候,商品自減的值可能不準(zhǔn)確。所以當(dāng)我們?cè)谝粋€(gè)事務(wù)中對(duì)count字段進(jìn)行修改的時(shí)候,其他事務(wù)應(yīng)該只能讀取指定id的count,而不能進(jìn)行update等操作。這個(gè)時(shí)候就需要用到for update.
sql語(yǔ)句:
start transaction ;
select * from table_name where id =1 for update ;
update table_name set count = count - 1 where id= 1;
此時(shí)如果另一個(gè)事務(wù)也想執(zhí)行類似的操作:
start transaction ;
select * from table_name where id =1 for update ;
//下面的這行sql會(huì)等待,直到上面的事務(wù)回滾或者commit才得到執(zhí)行。
update table_name set count = count - 1 where id= 1;
*注:當(dāng)選中某一個(gè)行的時(shí)候,如果是通過(guò)主鍵id選中的。那么這個(gè)時(shí)候是行級(jí)鎖。
其他的行還是可以直接insert 或者update的。如果是通過(guò)其他的方式選中行,或者選中的條件不明確包含主鍵。這個(gè)時(shí)候會(huì)鎖表。其他的事務(wù)對(duì)該表的任意一行記錄都無(wú)法進(jìn)行插入或者更新操作。只能讀取。
作者:林偉成
鏈接:https://www.jianshu.com/p/aaee995176ba
來(lái)源:簡(jiǎn)書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。