答案 0 :(得分:9)
您应该能够回滚事务,因为表引擎是InnoDB。
无论如何,这是进行交易的正确方法,
SET autocommit=0;
START TRANSACTION;
Your Query here.
ROLLBACK;
并确保在您需要回滚的查询之后没有使用COMMIT
。参考
Table Engines和Transaction。并且在创建数据库连接时,默认情况下它处于自动提交模式。这意味着每个单独的SQL语句都被视为一个事务,并在执行后立即自动提交。因此,如果您需要自己进行交易,则必须按AUTOCOMMIT = 0
关闭自动提交模式。有关详细信息,请参阅此link。
答案 1 :(得分:6)
By default, MySQL starts the session
for each new connection with
autocommit enabled,
您可以在运行查询之前设置自动提交模式禁用
SET autocommit=0;
参考:
<强> Link 1 强>
<强> Link 2 强>
答案 2 :(得分:3)
SET autocommit=0;
BEGIN;
.
.
.
ROLLBACK;
答案 3 :(得分:2)
确保您已执行命令
start transaction;
在查询删除之前。
答案 4 :(得分: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;
答案 5 :(得分:0)
我有同样的问题,但我检查过innodb支持
第一: 验证Engine 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服务,问题解决了。
答案 6 :(得分:0)
我认为有一件重要的事情需要提及:在交易完成后重新启用自动提交。
<menu>
<menupopup>
<menuitem label="${each}" forEach="@load(vm.menupoints)" />
</menupopup>
</menu>
否则,即使没有事务,在禁用SET autocommit = 0;
START TRANSACTION;
INSERT INTO ..
UPDATE <table> ..
COMMIT;
SET autocommit = 1;
后执行的任何操作都需要您显式提交。
答案 7 :(得分:0)
对于我来说,回滚对于InnoDB引擎也不起作用。
但是在begin;
之后添加start transaction;
语句即可解决。
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;
真的我不知道原因,如果有人知道,请在这里评论。