我们的应用程序向MySQL数据库触发INSERT查询以添加记录。我想知道记录是否自动提交。如果我运行ROLLBACK命令,数据库何时执行回滚?提交后是否可以回滚?
我们的应用程序向MySQL数据库触发INSERT查询以添加记录。我想知道记录是否自动提交。如果我运行ROLLBACK命令,数据库何时执行回滚?提交后是否可以回滚?
Answers:
问题的答案取决于您是否在一项涉及多个语句的事务中。(您已使用InnoDB标记了问题,而MyISAM的答案将有所不同。)
从参考手册中:http : //dev.mysql.com/doc/refman/5.1/en/commit.html
默认情况下,MySQL在启用自动提交模式的情况下运行。这意味着,一旦执行更新(修改)表的语句,MySQL就会将更新存储在磁盘上以使其永久化。
因此,是的,默认情况下,如果您仅使用INSERT
,则将提交您插入的记录,并且没有必要尝试回滚它们。(这实际上与在BEGIN
和之间包装每个语句相同COMMIT
。)
但是,如果您要显式处理事务,则必须使用COMMIT
来提交存储记录,但也可以使用ROLLBACK
。
您可以使用START TRANSACTION
(或BEGIN
)显式启动事务。这与autocommit
设置无关(默认情况下处于启用状态):
使用START TRANSACTION,自动提交将保持禁用状态,直到您使用COMMIT或ROLLBACK结束事务。然后,自动提交模式将恢复为之前的状态。
另外,如果autocommit=0
我认为在事务的另一端之后有任何语句将启动事务(但是您仍然可以START TRANSACTION
显式使用);至少这是我解释的方式:
自动提交模式。如果设置为1,对表的所有更改将立即生效。如果设置为0,则必须使用COMMIT接受事务或使用ROLLBACK取消它。如果autocommit为0,并将其更改为1,则MySQL对所有打开的事务执行自动COMMIT。开始事务的另一种方法是使用START TRANSACTION或BEGIN语句。请参见第12.3.1节“开始事务,提交和回滚语法”。
更具体地说,“另一种开始事务的方式”似乎意味着设置“ autocommit = 0”足以启动事务(至少恰好在开始会话的每个语句之前或在COMMIT
/之后ROLLBACK
)。我会建议使用BEGIN
或START TRANSACTION
明确反正就算autocommit=0
,因为它可以更清楚地看到在事务开始或结束时。
(如何开始事务可能取决于应用程序使用MySQL的方式。)
默认情况下,InnoDB设置为autocommit = 1或ON。一旦提交,便无法回滚。
您必须执行以下两项操作之一才能禁用它:
选项1:将其添加到/etc/my.cnf并重新启动mysql
[mysqld]
autocommit=0
选项2:在开始任何有意义的SQL之前,请在开放式数据库连接中执行其中一项操作
SET autocommit = 0;
START TRANSACTION;
在这两个选项下,您将必须执行手动COMMIT或手动ROLLBACK。
警告
如果表是MyISAM,则说明更为简单。由于MyISAM存储引擎没有事务,因此执行的所有INSERT,UPDATE和DELETE都是永久的。没有任何回滚。