mysql事務並發更新金額


在此簡單的記錄一下,mysql的事務並發過程

首先創建一個parent表

 

create table parent (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  `value` varchar(32) NOT NULL DEFAULT '' COMMENT '錢',
    PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=92616 DEFAULT CHARSET=utf8mb4 COMMENT='事務測試表';

 

 1、通過事務A和事務B並發更新數據的某一行數據

左側為事務A,右側為事務B,首先讀取到金額都是200原

 

 

在事務A中更新金額為210,在事務B中更新金額為220,當在A事務中提交了更新語句后,事務B中也觸發更新操作,B事務中會觸發獲取鎖失敗的情況。

同時在事務A中獲取金額為210,B事務中獲取的金額為200(事務隔離)

 

然后提交A事務,並在事務B中更新金額為value+2,這時會發現B中金額並不是220,而是230,所以mysql中的更新操作必然會獲取鎖,獲取到鎖之后,讀取當前行的最新版本,然后再執行寫操作

 

 

 

2、直接更新數據庫金額

 

開啟事務A和事務B,獲取到的金額為210元

 

在事務A中更新金額為300,事務B中更新金額為200,會觸發事務獲取鎖失敗

 

提交事務A,並在事務B將金額更新為200,事務B更新成功,

 

提交事務B,發現最終金額變為了200,造成了金額丟失

 

 

總結以上得出,數據庫操作中,直接將金額更新為一個值是很危險的操作,因為這個值在當前事務操作的過程中可能已經被修改了,對於先讀數據,然后更新值的場景一定要加鎖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM