我们的应用程序向 MySQL 数据库发出 INSERT 查询以添加记录。我想知道记录是否被自动提交。如果我运行 ROLLBACK 命令,数据库何时执行回滚?在 COMMIT 之后是否可以回滚?
Bru*_*uno 10
您的问题的答案取决于您是否在一项跨越多个语句的事务中。(你已经用 InnoDB 标记了这个问题,MyISAM 的答案会有所不同。)
从参考手册:http : //dev.mysql.com/doc/refman/5.1/en/commit.html
默认情况下,MySQL 在启用自动提交模式的情况下运行。这意味着一旦您执行更新(修改)表的语句,MySQL 就会将更新存储在磁盘上以使其永久化。
所以是的,默认情况下,如果您只是使用INSERT,您插入的记录将被提交,并且尝试回滚它们毫无意义。(这实际上与在BEGIN和之间包装每个语句相同COMMIT。)
但是,如果您要明确处理事务,则必须使用COMMITcommit store 记录,但您也可以使用ROLLBACK.
您可以使用START TRANSACTION(或BEGIN)显式启动事务。这与autocommit设置无关(默认开启):
使用 START TRANSACTION,自动提交将保持禁用状态,直到您使用 COMMIT 或 ROLLBACK 结束事务。自动提交模式然后恢复到以前的状态。
或者,如果autocommit=0,我认为在另一个事务结束之后的任何语句都将启动一个事务(但您仍然可以START TRANSACTION显式使用);这至少是我解释这个的方式:
自动提交模式。如果设置为 1,则对表的所有更改都会立即生效。如果设置为 0,则必须使用 COMMIT 来接受事务或使用 ROLLBACK 取消它。如果 autocommit 为 0 并且您将其更改为 1,则 MySQL 对任何打开的事务执行自动提交。另一种开始事务的方法是使用 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
Run Code Online (Sandbox Code Playgroud)
选项 2:在开始任何有意义的 SQL 之前,在打开的 DB Conenction 中执行这些操作之一
SET autocommit = 0;
START TRANSACTION;
Run Code Online (Sandbox Code Playgroud)
在这两个选项下,您必须执行手动 COMMIT 或手动 ROLLBACK。
警告
如果表是MyISAM,那么解释就更简单了。由于 MyISAM 存储引擎没有事务,因此执行的所有 INSERT、UPDATE 和 DELETE 都是永久性的。没有任何回滚。
| 归档时间: |
|
| 查看次数: |
36851 次 |
| 最近记录: |