在此簡單的記錄一下,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,造成了金額丟失
總結以上得出,數據庫操作中,直接將金額更新為一個值是很危險的操作,因為這個值在當前事務操作的過程中可能已經被修改了,對於先讀數據,然后更新值的場景一定要加鎖