MySQL中的回滚不起作用

17

我有一张用户表,里面有5条记录。

我删除了其中两条记录,然后执行了回滚命令,并且执行成功了。

但是那两条删除的记录并没有被恢复。

这个用户表的引擎是InnoDB


你的问题标题非常有力!听起来像是西班牙语,意思是“你们MySQL的开发人员在编码时服用兴奋剂,而你们的终端用户一直在使用被服用过的数据库!”哈哈。MySQL数据库非常重要!你不能随便对它进行这样的指责 :) - Damilola Olowookere
9个回答

26
你应该能够在表引擎为InnoDB的情况下回滚你的事务。 enter image description here

无论如何,这是进行事务的正确方法,

SET autocommit=0;
START TRANSACTION; 
Your Query here.
ROLLBACK;

请确保在需要回滚的查询之后不要使用 COMMIT。参考表引擎事务处理。当创建数据库连接时,默认情况下是自动提交模式。这意味着每个单独的SQL语句被视为一个事务,并在执行后自动提交。因此,如果您需要自己执行事务,则必须通过AUTOCOMMIT = 0关闭自动提交模式。更多信息,请参阅此链接


我直接使用了"start transac"和"rollback"。但是我没有使用"SET autocommit=0;"。但是对我来说,事务回滚起作用了。我想知道"SET autocommit=0;"的目的是什么。 - Bharanikumar
1
@Bharanikumar:当创建一个数据库连接时,默认情况下它处于自动提交模式。这意味着每个单独的SQL语句都被视为一个事务,并在执行后自动提交。因此,如果您需要自己处理事务,则必须通过“set AUTOCOMMIT = 0”关闭自动提交模式。请参考http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commit.html。 - Ayyappan Sekar
5
在使用事务之前,不需要关闭自动提交。参见http://dev.mysql.com/doc/refman/5.0/en/commit.html。"要隐式禁用单个语句的自动提交模式,请使用START TRANSACTION语句。使用START TRANSACTION后,自动提交将保持被禁用状态,直到您通过COMMIT或ROLLBACK结束事务。然后,自动提交模式恢复为其先前的状态。" - Travesty3

6
By default, MySQL starts the session
for each new connection with
autocommit enabled,

在运行查询之前,您可以将自动提交模式设置为禁用。

SET autocommit=0;

ref:

Link 1

Link 2


2

确保您已经执行了该命令

start transaction;  

查询前删除。


2

2
我不知道你是否在锁定表格,但我遇到了同样的问题,似乎回滚不起作用。
在我的事务中,我调用了“LOCK TABLES…”,它会隐式提交任何活动事务,然后尝试锁定表格。

(http://dev.mysql.com/doc/refman/5.0/en/lock-tables-and-transactions.html)

我最终锁定了交易之外(在交易之前),因为这是我在交易中要做的第一件事情。或者,您可以按照文档建议的方式操作:
SET autocommit=0;
LOCK TABLES t1 WRITE, t2 READ, ...;
... do something with tables t1 and t2 here ...
COMMIT;
UNLOCK TABLES;

1

我有同样的问题,但是我已经检查了InnoDB支持。

首先,请尝试通过以下方式验证INNODB引擎是否可用:

mysql> show engines;

如果INNODB被禁用:那么
第二步: 进入文件“my.ini”,在我的情况下它在C:\AppServ\mysql中 在该文件中删除以下行的“#”
#default-storage-engine=INNODB -> default-storage-engine=INNODB

并且在行skip-innodb后面添加“#”

skip-innodb -> #skip-innodb

第三步:保存并重新启动MySQL服务,问题就解决了。

0
我认为有一件重要的事情需要提到:在事务完成后重新启用自动提交。
SET autocommit = 0;
START TRANSACTION;
    INSERT INTO ..
    UPDATE <table> ..
COMMIT;
SET autocommit = 1;

否则,即使没有事务,禁用autocommit后执行的任何操作都需要您显式提交。

0
如果您正在使用MySQL Workbench,您可以在“查询”选项卡中关闭自动提交事务。并且不要忘记在需要回滚的查询后使用“COMMIT;”。

-1

即使对我来说,回滚在InnoDB引擎中也无法正常工作。
但是在start transaction;之后添加begin;语句可以解决问题。

这对我有用
SET autocommit = 0;
start transaction;
begin;
-- DML query goes here
rollback;
SET autocommit = 1;

但是

这对我没用
SET autocommit = 0;
start transaction;
-- DML query goes here
rollback;
SET autocommit = 1;

真的我不知道原因,如果有人知道,请在这里留言。


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