数据库-乐观锁和悲观锁
寫在前面:
? ? 鎖根據其使用的方式可以劃分為:樂觀鎖和悲觀鎖。樂觀鎖即樂觀并發控制,悲觀鎖即悲觀并發控制,他們是處理并發控制時主要采用的技術手段。其中,悲觀鎖正是數據庫本身提供的鎖機制實現的。
? ? 悲觀鎖:
? ? 悲觀鎖(Pessimistic Concurrency Control)縮寫為PCC。從字面意義上理解,就是每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會進入阻塞狀態,直到它拿到鎖。在傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。
????它阻止一個事務以影響其他用戶的修改數據。如果一個事務執行的操作對某一個數據應用了鎖,那么只有當事務釋放了鎖,其他事務才能夠執行與鎖沖突的操作。
? ? 悲觀鎖主要應用于數據競爭激烈的環境,以及如果發生并發沖突時,對事務上鎖的成本低于讓事務回滾的情況。
? ? 樂觀鎖:
? ? 樂觀鎖(Optimistic?Concurrency Control)縮寫為OCC,從字面意義上理解,每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據。相對于悲觀鎖,樂觀鎖在處理數據庫時,不會使用數據庫提供的鎖機制,一般事項樂觀鎖的的方式就是記錄數據版本。
? ? 那么什么是數據版本?就是為數據增加的一個版本標識,在讀取數值的時候,將版本標識一同讀出,數據每更新一次,版本標識也會更新一次。當我們提交數據更新時,判斷數據庫表對應的當前版本標識信息與第一次的版本標識信息相比,如果相等,則會更新,如果不相等,則認為是過期數據。例如:使用一個自增長的整數作為數據版本,比如數據版本為2,在更新提交時version=6+1,用version=7和最開始的version+1相比,如果相等,則更新,如果不相同,則認為是過期數據,也就是說可能被其他線程更新過了。
????樂觀鎖適用于多讀的應用類型,這樣可以提高吞吐量,像數據庫如果提供類似于write_condition機制的其實都是提供的樂觀鎖。
案例分析:
????如一個金融系統,當某個職員讀取用戶的數據,并在讀出的用戶數據的基礎上進行修改時(如更改用戶帳戶余額),如果采用悲觀鎖機制,也就意味著整個操作過程中(從操作員讀出數據、開始修改直至提交修改結果的全過程),數據庫記錄始終處于加鎖狀態,這樣,如果有上千條、上萬條事務并發要處理,則會影響用戶的使用效率。
? ? 而如果使用了樂觀鎖,那么讀取出數據時,將此版本號一同讀出,之后更新時,對此版本號+1。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對。
對于上面修改用戶帳戶信息的例子而言,假設數據庫中帳戶信息表中有一個version 字段,當前值為 1 ;?而當前帳戶余額字段( balance )為 100元 。
1 職員 A 此時將其讀出( version=1 ),并從其帳戶余額中扣除?50(100-50 )。
2 在職員 A 操作的過程中,職員 B 也讀入此用戶信息( version=1 ),并從其帳戶余額中扣除?20(100-20 )。
3 職員 A 完成了修改工作,將數據版本號+1( version=2 ),連同帳戶扣除后余額( balance=50 ),提交至數據庫更新,此時由于提交數據版本=數據庫記錄當前版本+1,數據會被更新,數據庫記錄 version 更新為 2 。
4 職員 B 完成了操作,也將版本號+1( version=2 )試圖向數據庫提交數據( balance=80 ),但此時比對數據庫記錄版本時發現,職員 B 提交的數據版本號為 2 ,數據庫記錄當前版本+1= 3 ,2不等于3,因此,職員 B 的提交被駁回。這樣,就避免了職員 B 用基于 version=1 的舊數據修改的結果覆蓋職員 A 的操作結果的可能。
????
總結
以上是生活随笔為你收集整理的数据库-乐观锁和悲观锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第四章 大数据之hive搭建
- 下一篇: Python 弹出提示框