国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

mysql樂觀鎖如何達成

2024-07-24 12:33:26
字體:
來源:轉載
供稿:網友
  mysql樂觀鎖怎么實現
  實現方法
 
  1、用數據版本Version記錄機制實現,這是樂觀鎖最常用的一種實現方式。
 
  2、數據版本,即為數據增加一個版本標識,一般是通過為數據庫表增加一個數字類型的 version字段來實現。當讀取數據時,將version字段的值一同讀出,數據每更新一次,對此version值加1。當我們提交更新的時候,判斷數據庫表對應記錄的當前版本信息與第一次取出來的version值進行比對,如果數據庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期數據。
 
  實例
 
  update TABLE
  set value=2,version=version+1
  where id=#{id} and version=#{version}
  樂觀鎖不是數據庫自帶的,需要我們自己去實現。
 
  樂觀鎖是指操作數據庫時(更新操作),想法很樂觀,認為這次的操作不會導致沖突,在操作數據時,并不進行任何其他的特殊處理(也就是不加鎖),而在進行更新后,再去判斷是否有沖突了。整體思想就是CAS思想。
 
  通常實現是這樣的:在表中的數據進行操作時(更新),先給數據表加一個版本(version)字段,每操作一次,將那條記錄的版本號加1。也就是先查詢出那條記錄,獲取出version字段,如果要對那條記錄進行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,將version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。
 
  eg:
 
  下單操作包括3步驟:
 
  1、查詢出庫存信息:
 
  select (id,count,version) from t_goodsku where id=#{id}
  2、扣減2個庫存:
 
  程序中計算:count = count - 2;
 
  3、更新庫存:
 
  update t_goodsku
  set count={count},version=version+1
  where id=#{id} and version=#{version};
  第1步中查到的version其實是快照(read-commited和read-repeatable隔離機制下的MVCC機制),在這種情況下,第3步去update時,獲取鎖,where條件中進行判斷中的version=#{version},其實是拿當前version和第1步中的快照version進行比對
 
  如果比對成功,說明在這段時間內這條數據沒有被其他線程更新過,update成功;
 
  如果對比失敗,說明這段時間內這條數據被更新過,那么update失敗,報錯回滾或自旋。
 
  當然,這里是為了模擬樂觀鎖的場景,實際上更新庫存時一步便可以實現:
 
  更新庫存:
 
  update t_goodsku
  set count=count -2
  where id=#{id};
  到此,關于“mysql樂觀鎖如何實現”的學習就結束了,希望能夠解決大家的疑惑。

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巫山县| 虹口区| 聂拉木县| 神木县| 依兰县| 盐山县| 丰县| 德清县| 长乐市| 象山县| 哈巴河县| 涿鹿县| 洪湖市| 莆田市| 隆子县| 博兴县| 沈丘县| 孟连| 石阡县| 德格县| 乐昌市| 庆阳市| 静安区| 吴忠市| 富民县| 沙湾县| 米泉市| 开化县| 报价| 和林格尔县| 洞头县| 清远市| 连南| 木里| 吉隆县| 奈曼旗| 绩溪县| 湾仔区| 仁布县| 祁阳县| 张掖市|