MySQL Workbench:启动事务似乎在回滚之前已经提交

3

我写了一堆删除语句,并将它们封装在一个事务中:

start transaction;
delete a...
delete b...
delete c...
rollback;

我的想法是希望删除操作发生在一个事务内,在完成后进行回滚。如果其中一步失败,我希望成功的步骤也被回滚。

令我烦恼的是,delete a 能够正常工作,删除了几千行记录,但 delete b 失败了。但当我重新运行这些语句时,所有来自 a 的记录似乎都不见了。

这是因为事务仍然处于打开状态吗?我尝试过执行以下命令:

set session transaction isolation level read committed;
select a.*

我执行了删除操作,但是返回了零行结果,所以我认为并没有删除成功。那么成功的a删除是否已提交?如果是,那么在我能够保证完全可用的查询之前,如何防止这种情况再次发生?


确保你关闭autoCommit - undefined
4个回答

8

MySQL Workbench默认启用自动提交。在SQL编辑器中,有一个工具栏按钮可用于随时切换自动提交:

输入图像描述


指出这些特点很好,我肯定学到了一些东西。然而,我认为这个答案并没有真正解决 OP 遇到的主要问题,因为 start transaction 实际上会关闭(一个内部版本的)自动提交,直到事务完成,详见我的答案 - undefined

1

有人向我介绍了一种更好的方法来做这件事:

begin;
<sql transactions>
commit;

0
尝试将自动提交标志设置为false:
set @@autocommit = false;
start transaction;
delete a...
delete b...
delete c...
rollback;

0
是的,可能交易仍然处于打开状态。如果在其上方的某一行出现错误,rollback 不会被执行。只要事务没有被回滚,当使用 SELECT 时,数据似乎已被删除,但由于您尚未提交事务,您仍然可以使用 rollback详细版本 要验证此答案是否正确,您可以执行以下操作。
start transaction;
delete a...
SELECT @@non_existent_variableXYZ -- This gives an error
rollback;

现在运行SELECT * FROM information_schema.INNODB_TRX。您可以看到正在进行的事务。然后运行rollback(在不出错的脚本中,考虑在MySQL Workbench中创建一个新的查询选项卡)。您将看到删除操作被撤销,并通过再次运行SELECT可以看到事务不再存在于information_schema.INNODB_TRX中。
关于其他答案
这个答案表明您不需要将@@autocommit设置为0,就可以将多个语句分组成一个事务,并使用rollback进行回滚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接