樂觀鎖常見的兩種實現方式

2022-06-28 12:12:15 字數 1097 閱讀 9273

樂觀鎖一般會使用版本號機制或cas演算法實現。

1. 版本號機制

一般是在資料表中加上乙個資料版本號version欄位,表示資料被修改的次數,當資料被修改時,version值會加一。當執行緒a要更新資料值時,在讀取資料的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前資料庫中的version值相等時才更新,否則重試更新操作,直到更新成功。

舉乙個簡單的例子:

假設資料庫中帳戶資訊表中有乙個 version 字段,當前值為 1 ;而當前帳戶餘額字段( balance )為 $100 。當需要對賬戶資訊表進行更新的時候,需要首先讀取version欄位。

操作員 a 此時將其讀出( version=1 ),並從其帳戶餘額中扣除 $50( $100-$50 )。

在操作員 a 操作的過程中,操作員b 也讀入此使用者資訊( version=1 ),並從其帳戶餘額中扣除 $20 ( $100-$20 )。

操作員 a 完成了修改工作,提交更新之前會先看資料庫的版本和自己讀取到的版本是否一致,一致的話,就會將資料版本號加1( version=2 ),連同帳戶扣除後餘額( balance=$50 ),提交至資料庫更新,此時由於提交資料版本大於資料庫記錄當前版本,資料被更新,資料庫記錄 version 更新為 2 。

操作員 b 完成了操作,提交更新之前會先看資料庫的版本和自己讀取到的版本是否一致,但此時比對資料庫記錄版本時發現,操作員 b 提交的資料版本號為 2 ,而自己讀取到的版本號為1 ,不滿足 「 當前最後更新的version與操作員第一次讀取的版本號相等 「 的樂觀鎖策略,因此,操作員 b 的提交被駁回。

這樣,就避免了操作員 b 用基於 version=1 的舊資料修改的結果覆蓋操作員a 的操作結果的可能。

2. cas演算法

即compare and swap(比較與交換),是一種有名的無鎖演算法。無鎖程式設計,即不使用鎖的情況下實現多執行緒之間的變數同步,也就是在沒有執行緒被阻塞的情況下實現變數的同步,所以也叫非阻塞同步(non-blocking synchronization)。cas演算法涉及到三個運算元

當且僅當 v 的值等於 a時,cas通過原子方式用新值b來更新v的值,否則不會執行任何操作(比較和替換是乙個原子操作)。一般情況下是乙個自旋操作,即不斷的重試。

實現資料庫鎖的兩種方式

今天我們就來聊一聊資料庫的鎖,實現資料庫鎖的兩種方式 在提交事務時檢查自己上次讀取這條記錄後,是否有其他事務修改了這條記錄,如果沒有則提交,如果被修改了則回滾。在對資料庫進行處理的時候,樂觀鎖並不會使用資料庫提供的鎖機制。一般有三種方式實現樂觀鎖 update t irs resource set ...

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...

TabHost兩種實現方式

第一種 繼承tabactivity,從tabactivity中用gettabhost 方法獲取tabhost。只要定義具體tab內容布局就行了.package com.example.testtabhost import android.os.bundle import android.view.l...