couchbase 樂觀鎖的實(shí)現(xiàn) spring-data-couchbase > 4.3. Optimistic Locking

<a >點(diǎn)擊查看原文</a>

Couchbase Server does not support multi-document transactions or rollback. To implement optimistic locking, Couchbase uses a CAS (compare and swap) approach. When a document is mutated, the CAS value also changes. The CAS is opaque to the client, the only thing you need to know is that it changes when the content or a meta information changes too.

Couchbase服務(wù)不支持多文檔事務(wù)或者回滾骗炉。為了實(shí)現(xiàn)樂觀鎖,couchbase使用了cas(比較并交換)的方法。當(dāng)文檔發(fā)生變化咖为,cas值也改變瓶颠。cas對(duì)于客戶端來說舌剂,是不透明的攻晒,你只需要知道當(dāng)內(nèi)容和元數(shù)據(jù)改變的時(shí)候cas值會(huì)改變铸抑。

In other datastores, similar behavior can be achieved through an arbitrary(任意的) version field with a incrementing(遞增) counter. Since Couchbase supports this in a much better fashion, it is easy to implement. If you want automatic(自動(dòng)的) optimistic locking support, all you need to do is add a @Version
annotation on a long field like this:

別的數(shù)據(jù)庫遏暴,會(huì)使用一個(gè)任意的版本號(hào)和一個(gè)遞增的計(jì)數(shù)器來實(shí)現(xiàn)樂觀鎖侄刽。但是couchbase使用了更加優(yōu)良的方法,并且更容易實(shí)現(xiàn)朋凉。在一個(gè)long類型的字段上加上<code>@Version</code>注解州丹,可以自動(dòng)實(shí)現(xiàn)樂觀鎖。

<i>Example 13. A Document with optimistic locking.</i>

@Document
public class User { 
  @Version 
  private long version; 
  // constructor, getters, setters...
}

If you load a document through the template or repository, the version field will be automatically populated(填充) with the current CAS value. It is important to note that you shouldn’t access the field or even change it on your own. Once you save the document back, it will either succeed or fail with a OptimisticLockingFailureException
. If you get such an exception, the further approach(方法) depends on what you want to achieve(實(shí)現(xiàn)) application wise. You should either retry the complete load-update-write cycle or propagate(傳播) the error to the upper layers for proper(適當(dāng)?shù)模?handling.

如果你通過template或者repository加載一個(gè)文檔杂彭,會(huì)自動(dòng)把cas的值賦給<code>veriosn</code>字段墓毒。你不能去訪問這個(gè)字段,或者自己去修改它亲怠。保存一個(gè)文檔所计,要么成功要么失敗,失敗的時(shí)候团秽,會(huì)拋出<code>OptimisticLockingFailureException</code>異常主胧。當(dāng)你看到拋出這個(gè)異常,怎么處理徙垫,要看你希望應(yīng)用程序智能到什么程度讥裤。你可以重試,完成 <code>加載-更新-覆蓋</code>這個(gè)動(dòng)作 或者拋給上一層來處理姻报。

<strong>tip:悲觀鎖己英、樂觀鎖</strong>
<em>悲觀鎖</em>

是針對(duì)操作(對(duì)于某個(gè)級(jí)別的數(shù)據(jù)的)的獨(dú)占性來說的,在傳統(tǒng)的數(shù)據(jù)庫(如mysql)中吴旋,有針對(duì)庫的鎖损肛、針對(duì)表的鎖厢破、針對(duì)行記錄的鎖。悲觀鎖的缺點(diǎn)是治拿,舉個(gè)例子來說摩泪,一行記錄<code>12356346|Jon|36|Engineer</code>,如果使用了悲觀鎖劫谅,當(dāng)我做了一個(gè)<code>update user set age=26 where id=12356346</code>操作后见坑,此行數(shù)據(jù)鎖被占用,其他對(duì)此行數(shù)據(jù)的操作會(huì)被阻塞捏检。

<em>樂觀鎖</em>

樂觀鎖大多基于<code>數(shù)據(jù)版本</code>實(shí)現(xiàn)

1荞驴、讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出贯城,之后更新時(shí)熊楼,對(duì)此版本號(hào)加一。
2能犯、將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì)鲫骗,如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫表當(dāng)前版本號(hào),則予以更新踩晶,否則認(rèn)為是過期數(shù)據(jù)

<em>樂觀鎖的例子</em>

如一個(gè)金融系統(tǒng)执泰,當(dāng)某個(gè)操作員讀取用戶的數(shù)據(jù),并在讀出的用戶數(shù)據(jù)的基礎(chǔ)上進(jìn)行修改時(shí)(如更改用戶帳戶余額)合瓢,如果采用悲觀鎖機(jī)制坦胶,也就意味著整個(gè)操作過 程中(從操作員讀出數(shù)據(jù)、開始修改直至提交修改結(jié)果的全過程晴楔,甚至還包括操作 員中途去煮咖啡的時(shí)間)顿苇,數(shù)據(jù)庫記錄始終處于加鎖狀態(tài),可以想見税弃,如果面對(duì)幾百上千個(gè)并發(fā)纪岁,這樣的情況將導(dǎo)致怎樣的后果。
樂觀鎖機(jī)制在一定程度上解決了這個(gè)問題则果。樂觀鎖幔翰,大多是基于數(shù)據(jù)版本 ( Version )記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本西壮?即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí)遗增,在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個(gè) “version” 字段來實(shí)現(xiàn)款青。
讀取出數(shù)據(jù)時(shí)做修,將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一饰及。此時(shí)蔗坯,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫表當(dāng)前版本號(hào)燎含,則予以更新宾濒,否則認(rèn)為是過期數(shù)據(jù)。
對(duì)于上面修改用戶帳戶信息的例子而言屏箍,假設(shè)數(shù)據(jù)庫中帳戶信息表中有一個(gè) version 字段绘梦,當(dāng)前值為 1 ;而當(dāng)前帳戶余額字段( balance )為 $100 铣除。

1 操作員 A 此時(shí)將其讀出( version=1 )谚咬,并從其帳戶余額中扣除 $50( $100-$50 )鹦付。
2 在操作員 A 操作的過程中尚粘,操作員B 也讀入此用戶信息( version=1 ),并從其帳戶余額中扣除 $20 ( $100-$20 )敲长。
3 操作員 A 完成了修改工作郎嫁,將數(shù)據(jù)版本號(hào)加一( version=2 ),連同帳戶扣除后余額( balance=$50 )祈噪,提交至數(shù)據(jù)庫更新泽铛,此時(shí)由于提交數(shù)據(jù)版本大于數(shù)據(jù)庫記錄當(dāng)前版本,數(shù)據(jù)被更新辑鲤,數(shù)據(jù)庫記錄 version 更新為 2 盔腔。
4 操作員 B 完成了操作,也將版本號(hào)加一( version=2 )試圖向數(shù)據(jù)庫提交數(shù)據(jù)( balance=$80 )月褥,但此時(shí)比對(duì)數(shù)據(jù)庫記錄版本時(shí)發(fā)現(xiàn)弛随,操作員 B 提交的數(shù)據(jù)版本號(hào)為 2 ,數(shù)據(jù)庫記錄當(dāng)前版本也為 2 宁赤,不滿足 “ 提交版本必須大于記錄當(dāng)前版本才能執(zhí)行更新 “ 的樂觀鎖策略舀透,因此,操作員 B 的提交被駁回决左。
這樣愕够,就避免了操作員 B 用基于 version=1 的舊數(shù)據(jù)修改的結(jié)果覆蓋操作員A 的操作結(jié)果的可能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佛猛,一起剝皮案震驚了整個(gè)濱河市惑芭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌继找,老刑警劉巖遂跟,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡漩勤,警方通過查閱死者的電腦和手機(jī)感挥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來越败,“玉大人触幼,你說我怎么就攤上這事【糠桑” “怎么了置谦?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亿傅。 經(jīng)常有香客問我媒峡,道長,這世上最難降的妖魔是什么葵擎? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任谅阿,我火速辦了婚禮,結(jié)果婚禮上酬滤,老公的妹妹穿的比我還像新娘签餐。我一直安慰自己,他們只是感情好盯串,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布氯檐。 她就那樣靜靜地躺著,像睡著了一般体捏。 火紅的嫁衣襯著肌膚如雪冠摄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天几缭,我揣著相機(jī)與錄音河泳,去河邊找鬼。 笑死奏司,一個(gè)胖子當(dāng)著我的面吹牛乔询,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韵洋,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼竿刁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搪缨?” 一聲冷哼從身側(cè)響起食拜,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎副编,沒想到半個(gè)月后负甸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年呻待,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了打月。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚕捉,死狀恐怖奏篙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迫淹,我是刑警寧澤秘通,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站敛熬,受9級(jí)特大地震影響肺稀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜应民,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一话原、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瑞妇,春花似錦稿静、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽控漠。三九已至蔓倍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盐捷,已是汗流浹背偶翅。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碉渡,地道東北人聚谁。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像滞诺,于是被迫代替她去往敵國和親形导。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容