場(chǎng)景:
假設(shè)一個(gè)表有兩個(gè)字段(id,? value )疤孕, 假設(shè)在不使用事務(wù)的情況下品姓,同時(shí)有兩個(gè)操作更新 value 字段,操作一是先查詢羊苟,在內(nèi)存中進(jìn)行判斷然后再更新,操作二在操作一查詢記錄之后進(jìn)行了更新:update table set value = 'value3' where id= '1'感憾, 那么操作二的更新操作就會(huì)被覆蓋蜡励,從而出現(xiàn)修改失效問(wèn)題。
不加事務(wù)出現(xiàn)的失效數(shù)據(jù)問(wèn)題
解決辦法:
1. 這個(gè)時(shí)候,很多人會(huì)嘗試對(duì)業(yè)務(wù)的接口方法使用事務(wù)(+@Transactional)凉倚,事務(wù)之間有隔離性兼都;當(dāng)事務(wù)一執(zhí)行的時(shí)候會(huì)鎖住當(dāng)前記錄,防止其他事務(wù)操作當(dāng)前數(shù)據(jù)稽寒,這是一種悲觀鎖方式扮碧,但適用于很多情況。
2. 還有一種解決方式也很常用杏糙,當(dāng)你的更新操作依賴于原有的狀態(tài)慎王,可更改update 語(yǔ)句:update table set value = 'value2' where value = 'value1', 參考了樂(lè)觀鎖中的cas操作宏侍,然后再通過(guò)update受影響的行數(shù)取判斷是否更新成功柬祠。 這相當(dāng)于樂(lè)觀鎖方式,可極大地增加數(shù)據(jù)訪問(wèn)的并發(fā)量负芋。