并發(fā)事務帶來的問題
針對 mysql InnoDB
| 編號 | 問題 | 描述 |
|---|---|---|
| 1 | 臟讀 | |
| 2 | 不可重復讀 | |
| 3 | 幻讀 | |
| 4 | 丟失更新 | 兩個事務同時修改1 條記錄,事務 A 的修改覆蓋事務 B 的修改。 |
丟失更新
| 事務 A | 事務 B | |
|---|---|---|
| begin; | ||
| int b = select money from t where id = 0;//b 開始是 1 | ||
| b = b+1; | ||
| update t set money = b where id =0; | ||
| begin; | ||
| int b = select money from t where id = 0;//這里讀到是 1 | ||
| b = b+2; | ||
| commit;//b=2 | ||
| update t set money = b where id =0; | ||
| commit;//覆蓋 A 事務的 2,變成了 3 |
InnoDB默認的隔離級別 可重復讀 RR + next-key Lock 解決了上面的 1~3 的問題,那丟失更新的解決方法如下:
- 通過悲觀鎖,通過 select xxx for update 加 X 鎖
- 通過樂觀鎖(CAS), 記錄加多一個版本號,查詢時記錄下來,更新的時候做比較,不等于是重復執(zhí)行