資料庫 (2)樂觀鎖和悲觀鎖

2021-09-18 03:52:56 字數 1550 閱讀 1511

併發控制手段:

樂觀鎖(樂觀併發控制)

悲觀鎖(悲觀併發控制)

悲觀鎖:

當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是對該資料進行加鎖以防止併發。這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式稱之為悲觀併發控制。

悲觀併發控制實際上是:

先取鎖再訪問的保守策略,為資料處理的安全提供了保證。

在效率方面,處理加鎖的機制會讓資料庫產生額外的開銷,還有增加產生死鎖的機會;另外還會降低併發性,乙個事務如果鎖定了某行資料,其他事務就必須等待該事物處理完才可以處理那行資料。

樂觀鎖:

是相對於悲觀鎖而言的,樂觀鎖假設資料一般情況下不會造成衝突,所以在進行資料提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。

相對於悲觀鎖,在對資料庫。進行處理的時候,樂觀鎖並不會使用資料庫提供的機制。一般的實現樂觀鎖的方式就是記錄資料版本。

悲觀鎖的實現方式

悲觀鎖的實現,往往依靠資料庫提供的鎖機制。在資料庫中,悲觀鎖的流程如下:

在對記錄進行修改前,先嘗試為該記錄加上排它鎖。如果枷鎖失敗,說明該記錄正在被修改,那麼當前查詢可能需要等待或者跑出異常。如果成功加鎖,那麼就可以對記錄做修改,事務完成後就會解鎖了。期間如果有其他對該記錄做修改或加排它鎖的操作,都會等待我們解鎖或者丟擲異常。

樂觀鎖的實現方式

使用樂觀鎖就不需要借助資料庫的鎖機制了。

樂觀鎖主要就是兩個步驟:衝突檢測和資料跟新。

其實現方式有一種典型的就是compare and swapcas)。

cas是一項樂觀鎖技術,當多個執行緒嘗試使用csa同時跟新乙個變數時,只有其中乙個執行緒能更新變數的值,而其他執行緒都失敗,失敗的執行緒不會被掛起,而是被告知在這次競爭中失敗,並可以再次嘗試。

樂觀鎖和悲觀鎖的選擇。

樂觀鎖並未真正加鎖,效率高。一旦鎖的粒度掌握不好,更新失敗的概率會比較高,容易發生業務失敗。悲觀鎖依賴於資料庫鎖,效率低。更新失敗的的概率比較低。

資料庫的樂觀鎖和悲觀鎖

悲觀鎖 假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作,假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。資料鎖定 資料將暫時不會得到修改 樂觀鎖 假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則...

資料庫鎖 樂觀鎖 悲觀鎖理解

參考 mysql innodb中,樂觀鎖 悲觀鎖 共享鎖 排它鎖 行鎖 表鎖 死鎖概念的理解 樂觀鎖最簡單的實現就是在表中加乙個版本號欄位如version,每次新增設定為1,更新的時候檢查版本號是否一致,如果不一致就更新失敗。版本一致才能更新,然後將版本號 1。首先資料庫需要關閉自動提交功能,或者說...

資料庫之樂觀鎖,悲觀鎖

樂觀鎖 1.只在提交操作時檢查是否違反資料完整性。使用自增長的整數表示資料版本號。更新時檢查版本號是否一致,比如資料庫中資料版本為6,更新提交時version 6 1,使用該version值 7 與資料庫version 1 7 作比較,如果相等,則可以更新,如果不等則有可能其他程式已更新該記錄,所以...