日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql解决丢失更新_mysql 数据丢失更新的解决方法

發布時間:2025/3/21 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql解决丢失更新_mysql 数据丢失更新的解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最新看《innodb 引擎內幕》,作者有介紹丟失更新的問題,這里記錄自己的想法和方案

-------------------------------------------------------------------

問題描述:

mysql 數據庫丟失更新的定義:(其實在數據庫角度都不會產生丟失更新的問題,問題的源頭應用程序邏輯更新的問題)

1. 事務1 查詢一行數據放在本地緩存,并且顯示給用戶user1? ? ? ? -->select balance from account where user= 'a' ;

2. 事務2 查詢同樣的一行數據放在本地緩存,并且顯示給用戶user2? ??-->select?balance from account where user= 'a'?;

3. 用戶user1修改這條數據,并且更新提交數據庫? ???--> update?account set?balance =?balance -100 where?user= 'a'?;

4. 用戶user2修改顯示的數據,并且更新提交數據庫? --> update?account set?balance =?balance -800 where?user= 'a'?;

顯然上面user1 更新的數據丟失了,這也是更新覆蓋,比如用戶轉賬的操作。a 賬戶總共1000,事務1和事務2查詢賬戶都是1000,然后事務1賬戶扣減100,提交。事務2扣減800提交。這時候賬戶余額為200,事務1扣減的100 會不翼而飛,這會導致嚴重的問題。

-------------------------------------------------------------------

暫時想到兩種解決辦法:

解決辦法1:使用悲觀鎖

1)讀取鎖定 --> select balance from account where user= 'a'? for update

2)更新 -->?update?account set?balance =?balance -100 where?user= 'a'

解決辦法2: 使用樂觀鎖

1)表增加字段 jpa_version int 版本號? -->??select balance,version from account where user= 'a'

2)? 使用版本號更新 -->?update?account set?balance =?balance -100 where?user= 'a' and jpa_version = ${version}

總結:

對于賬戶交易建議直接使用悲觀,數據庫的性能很高,并發度不是很高的場景兩者性能沒有太大差別。如果是交易減庫存的操作可以考慮樂觀鎖,保證并發度。

總結

以上是生活随笔為你收集整理的mysql解决丢失更新_mysql 数据丢失更新的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。