mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?
樂觀鎖和悲觀鎖相信大家都是知道的,這是java中的基礎知識,今天我們就來看看它們兩者該如何使用代碼實現吧。
樂觀鎖實現
1)、表設計
表task,分別有三個字段id,value、version
2)、具體實現
-首先讀取task表中的數據,得到version的值為versionValue
-在每次更新task表value字段時,因為要防止可能發生的沖突,我們需要這樣操作select?(value,version)?from?task?where?id=#{id}
update?task
set?value=newValue,version=versionValue+?1
whereid=#{id}?and?version=versionValue;
只有當這條語句執行成功了,本次更新value字段的值才會表示成功
我們假設有兩個節點A與B都需要更新task表中的value字段值,在相同時刻,A和B節點從task表中讀到的version值都為2,那么A節點和B節點在更新value字段值的時候,都需要操作
update task set value = newValue,version = 3 where version = 2;
實際上其實只有1個節點執行該SQL語句成功,我們假設A節點執行成功,那么此時task表的version字段的值是3,B節點再操作update task
set value = newValue,version = 3 where version =
2;這條SQL語句是不執行的,這樣就保證了更新task表時不發生沖突
悲觀鎖實現
數據庫中悲觀鎖實現,通常都是依靠的數據庫鎖機制。悲觀鎖原理:當我們在查詢出goods信息后就把當前的數據鎖定,直到我們修改完畢后再解鎖。那么在這個過程中,因為goods被鎖定了,就不會出現有第三者來對其進行修改了。//使用悲觀鎖,我們必須要首先關閉mysql數據庫的自動提交屬性
set?autocommit=0;
//設置完autocommit后,我們就可以執行我們的正常業務了。具體如下:
//1.開始事務
start?transaction;
//2.查詢出商品信息
select?status?from?t_goods?where?id=1?for?update;
//3.根據商品信息生成訂單
insert?into?t_orders?(id,goods_id)?values?(null,1);
//4.修改商品status為2
update?t_goods?set?status=2;
//5.提交事務
commit;
以上就是今天的所有內容了,還想知道更多樂觀鎖與悲觀鎖等常見問題,就請持續關注本網站吧。
推薦閱讀:
總結
以上是生活随笔為你收集整理的mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想加‏盟一家卤&
- 下一篇: 草莓苗哪里便宜 挑选草莓苗的小技巧?