簡體   English   中英

MySQL 事務可以在沒有 ROLLBACK 查詢的情況下回滾嗎?

[英]Can MySQL transaction rollback without ROLLBACK query?

我正在研究一個金融系統,但我遇到了 MySQL 事務的問題。

該系統是一個簡單的證券交易所,用戶可以在其中買賣虛擬股票。 為了在買賣過程中保持誠信,我使用交易。 問題是在某些情況下(我不知道它取決於什么)一些事務會回滾(或未提交),但會處理下一個查詢。

過程如下:

  1. 用戶想以 1000 美元購買股票
  2. 在訂單簿中有 4 個 250 美元的優惠
  3. START TRANSACTION
  4. 對於每個優惠:
  5. 腳本執行 UPDATE 查詢(將美元從一個用戶移動到另一個用戶並以相反的方式共享)。 然后腳本 INSERTs 條目到歷史記錄表。
  6. 用戶支付費用(更新余額)。
  7. 對下一個報價重復 5 和 6。
  8. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM