可以舉個例子:A程序和B程序同時在更新一個balance

A程序要對balance扣減20,B程序要對balance扣減15
如何保證balance更新準确?
加悲觀鎖
悲觀鎖悲觀的認為很有可能會有沖突,是以我們要先加鎖比較好
所有的程序/線程在更新前先加鎖,加鎖成功後再進行更新/送出
select balance from balance_table where user=A for update;
update balance_table set balance=balance-xxx;
commit;
加樂觀鎖
樂觀鎖樂觀的認為,未必有沖突,即使沖突了,那我們送出失敗重試一次嘛
但是樂觀鎖如何知道有沖突發生?這個就要靠version機制,在事物開始會擷取version,在送出事務的時候會再次校驗version
先更新,如果 更新,送出 後,發現與之前version不一緻,那麼說明有其他程序進行了操作,執行復原
select version from balance_table where user=A ; --擷取version但是不加鎖
--得到version :2
update balance_table set balance=balance-xxx,version=version+1 where user=A and version=2; --更新的時候帶version,如果version已經被修改,就不會更新成功
悲觀鎖和樂觀鎖的利弊
懶得寫了,直接把别人的東西貼過來
快照隔離是怎麼回事?
其實快照隔離跟樂觀鎖有點關聯,快照隔離實際就是因為儲存了多個更新版本,是的程式能夠在并發操作的情況下獲得自己想要的version
比如:
A程式是應用程式,對資料庫資料不斷的增删改查,B程式是統計程式,對資料進行靜态分析,比如收支平衡