首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL事务回滚不需要回滚查询?

MySQL事务回滚不需要回滚查询?
EN

Stack Overflow用户
提问于 2017-02-13 08:25:35
回答 2查看 2.2K关注 0票数 2

我正在研究一个金融系统,我对MySQL交易有一个问题。

该系统是一个简单的证券交易所,用户可以在这里买卖虚拟股票。为了在买卖过程中保持诚信,我使用交易。问题是,在某些情况下(我不知道它取决于什么),一些事务被回滚(或不执行),但是下一个查询将被处理。

这一进程如下:

  1. 用户想以1000美元的价格购买股票
  2. 在订单簿中有4张250美元的报价
  3. START TRANSACTION
  4. 对于每一项提议:
  5. 脚本执行更新查询(将美元从一个用户移动到另一个用户并以相反的方式共享)。然后脚本将条目插入到历史表中。
  6. 用户支付费用(更新余额)。
  7. 下一次报价重复第5和第6次。
  8. COMMIT

现在关键的部分-在某些情况下,从第5点更改没有保存,但从6是,他们是(我看到,费用已支付,但在历史上没有交易)。在此事务处理期间,我不会使用ROLLBACK,脚本也不会中断(因为在这种情况下,不需要支付费用)。

在没有ROLLBACK查询的情况下,是否存在事务回滚的可能性?或者MySQL只能提交几个最新的查询,而不是全部?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-14 16:08:28

这个问题被问了很长时间了,但问题实际上是我没有检查每个查询的SQL错误。

实际上,在某些时候,当我应该回滚事务时,我没有这样做。

如果您正在寻找答案-请再次检查您是否测试了事务中的所有查询以确保成功执行,并且不要相信您正在使用的框架是自动执行的(只需再次检查)。

票数 0
EN

Stack Overflow用户

发布于 2017-02-13 09:10:18

无论事务处理与否,客户端代码都有责任确保所有插入或更新查询成功完成,然后发出显式回滚或关闭与我们提交的连接,以发出隐式回滚。如果其中任何一个失败,但您的代码继续,这些查询将不会生效(因为他们失败),但其余的将可以。

下面是一个简化的示例:

代码语言:javascript
复制
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

我们应该在这里倒车和中止,但我们没有。

代码语言:javascript
复制
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行。

除此之外,在许多情况下,您可以得到不想要的提交,但不想要的回滚是我不确定的事情,除非您用挂起的更改终止会话。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42199590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档