我正在研究一个金融系统,我对MySQL交易有一个问题。
该系统是一个简单的证券交易所,用户可以在这里买卖虚拟股票。为了在买卖过程中保持诚信,我使用交易。问题是,在某些情况下(我不知道它取决于什么),一些事务被回滚(或不执行),但是下一个查询将被处理。
这一进程如下:
START TRANSACTIONCOMMIT现在关键的部分-在某些情况下,从第5点更改没有保存,但从6是,他们是(我看到,费用已支付,但在历史上没有交易)。在此事务处理期间,我不会使用ROLLBACK,脚本也不会中断(因为在这种情况下,不需要支付费用)。
在没有ROLLBACK查询的情况下,是否存在事务回滚的可能性?或者MySQL只能提交几个最新的查询,而不是全部?
发布于 2020-04-14 16:08:28
这个问题被问了很长时间了,但问题实际上是我没有检查每个查询的SQL错误。
实际上,在某些时候,当我应该回滚事务时,我没有这样做。
如果您正在寻找答案-请再次检查您是否测试了事务中的所有查询以确保成功执行,并且不要相信您正在使用的框架是自动执行的(只需再次检查)。
发布于 2017-02-13 09:10:18
无论事务处理与否,客户端代码都有责任确保所有插入或更新查询成功完成,然后发出显式回滚或关闭与我们提交的连接,以发出隐式回滚。如果其中任何一个失败,但您的代码继续,这些查询将不会生效(因为他们失败),但其余的将可以。
下面是一个简化的示例:
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行。
除此之外,在许多情况下,您可以得到不想要的提交,但不想要的回滚是我不确定的事情,除非您用挂起的更改终止会话。
https://stackoverflow.com/questions/42199590
复制相似问题