[英]Can MySQL transaction rollback without ROLLBACK query?
我正在研究一個金融系統,但我遇到了 MySQL 事務的問題。
該系統是一個簡單的證券交易所,用戶可以在其中買賣虛擬股票。 為了在買賣過程中保持誠信,我使用交易。 問題是在某些情況下(我不知道它取決於什么)一些事務會回滾(或未提交),但會處理下一個查詢。
過程如下:
START TRANSACTION
COMMIT
現在是關鍵部分 - 在某些情況下,第 5 點的更改沒有保存,而是從第 6 點開始保存(我看到已支付費用,但歷史記錄中沒有交易)。 在此交易期間我沒有使用ROLLBACK
並且腳本沒有中斷(因為在這種情況下不會支付費用)。
事務是否有可能在沒有ROLLBACK
查詢的情況下ROLLBACK
? 或者 MySQL 可以只提交幾個最新的查詢而不是全部?
事務與否,您的客戶端代碼有責任驗證所有 INSERT 或 UPDATE 查詢是否成功完成,然后發出顯式 ROLLBACK 或關閉與我們的 COMMIT 的連接以發出隱式 ROLLBACK。 如果其中任何一個失敗,但您的代碼繼續運行,這些查詢將不會生效(因為它們失敗了),但其余的會生效。
這是一個簡化的示例:
mysql> create table test (
-> id int(10) unsigned not null,
-> primary key (id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into test(id) values (1);
Query OK, 1 row affected (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test(id) values (2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test(id) values (-3);
ERROR 1264 (22003): Out of range value for column 'id' at row 1
我們應該在這里回滾和中止,但我們沒有。
mysql> insert into test(id) values (4);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test;
+----+
| id |
+----+
| 1 |
| 2 |
| 4 |
+----+
3 rows in set (0.00 sec)
預計 4 行,得到 3。
除此之外,在很多情況下,您可以獲得不需要的 COMMIT 但不需要的 ROLLBACK 是我不確定會發生的事情,除非您終止具有掛起更改的會話。
問這個問題已經很長時間了,但問題實際上是我沒有檢查每個查詢的 SQL 錯誤。
實際上在某些時候,當我應該回滾事務時,我沒有這樣做。
如果您正在尋找答案 - 再次檢查您是否測試了事務中的所有查詢以成功執行,並且不要相信您正在使用的框架會自動為您執行(只需再次檢查)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.