AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 4252
Accepted
RPK
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 2 个回答
  • 41309 Views

2 个回答

  • Voted
  1. 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 的方式。)

    • 10
  2. 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 都是永久性的。没有任何回滚。

    • 7

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve