天天看點

悲觀鎖和樂觀鎖

可以舉個例子: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程式是統計程式,對資料進行靜态分析,比如收支平衡