RPK Asked: 2011-08-03 10:17:39 +0800 CST2011-08-03 10:17:39 +0800 CST 2011-08-03 10:17:39 +0800 CST INSERT 会自动提交吗? 772 我们的应用程序向 MySQL 数据库发起 INSERT 查询以添加记录。我想知道记录是否自动提交。如果我运行 ROLLBACK 命令,数据库何时执行回滚?COMMIT 之后是否可以 ROLLBACK ? mysql innodb 2 个回答 Voted Best Answer Bruno 2011-08-04T04:53:22+08:002011-08-04T04:53:22+08:00 您的问题的答案取决于您是否处于跨越多个语句的事务中。(你已经用 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 节,“START TRANSACTION、COMMIT 和 ROLLBACK 语法”。 更具体地说,“开始事务的另一种方式”似乎暗示设置“autocommit=0”足以启动事务(至少在开始会话的每个语句之前或在COMMIT/之后ROLLBACK)。我建议使用BEGINorSTART TRANSACTION明确地即使autocommit=0,因为它可以更清楚地查看事务何时开始或结束。 (您如何启动事务可能取决于您的应用程序使用 MySQL 的方式。) RolandoMySQLDBA 2011-08-03T10:30:31+08:002011-08-03T10:30:31+08:00 默认情况下,InnoDB 设置为 autocommit = 1 或 ON。一旦提交,它们就不能回滚。 您必须执行以下两项操作之一才能禁用它: 选项 1:将其添加到 /etc/my.cnf 并重新启动 mysql [mysqld] autocommit=0 选项 2:在开始任何有意义的 SQL 之前,在打开的 DB Conenction 中执行其中一项 SET autocommit = 0; START TRANSACTION; 在这两个选项下,您必须执行手动 COMMIT 或手动 ROLLBACK。 警告 如果表是MyISAM,那么解释就比较简单了。由于 MyISAM 存储引擎没有事务,所有执行的 INSERT、UPDATE 和 DELETE 都是永久性的。没有任何回滚。
您的问题的答案取决于您是否处于跨越多个语句的事务中。(你已经用 InnoDB 标记了这个问题,MyISAM 的答案会有所不同。)
来自参考手册:http ://dev.mysql.com/doc/refman/5.1/en/commit.html
所以是的,默认情况下,如果您只是使用
INSERT
,您插入的记录将被提交,并且尝试回滚它们是没有意义的。(这实际上与在BEGIN
和之间包装每个语句相同COMMIT
。)但是,如果您要显式处理事务,则必须使用
COMMIT
提交存储记录,但您也可以使用ROLLBACK
.您可以使用
START TRANSACTION
(或BEGIN
)显式启动事务。这与autocommit
设置无关(默认开启):或者,如果
autocommit=0
,我认为在事务的另一端之后的任何语句都将启动事务(但您仍然可以START TRANSACTION
显式使用);至少我是这样解释的:更具体地说,“开始事务的另一种方式”似乎暗示设置“autocommit=0”足以启动事务(至少在开始会话的每个语句之前或在
COMMIT
/之后ROLLBACK
)。我建议使用BEGIN
orSTART TRANSACTION
明确地即使autocommit=0
,因为它可以更清楚地查看事务何时开始或结束。(您如何启动事务可能取决于您的应用程序使用 MySQL 的方式。)
默认情况下,InnoDB 设置为 autocommit = 1 或 ON。一旦提交,它们就不能回滚。
您必须执行以下两项操作之一才能禁用它:
选项 1:将其添加到 /etc/my.cnf 并重新启动 mysql
选项 2:在开始任何有意义的 SQL 之前,在打开的 DB Conenction 中执行其中一项
在这两个选项下,您必须执行手动 COMMIT 或手动 ROLLBACK。
警告
如果表是MyISAM,那么解释就比较简单了。由于 MyISAM 存储引擎没有事务,所有执行的 INSERT、UPDATE 和 DELETE 都是永久性的。没有任何回滚。