2

我正在使用带有 mysqldb 适配器的 web2py dal 来连接到 mysql 服务器。

我的问题:

  1. 为什么在“ set autocommit=0 ”之后需要一个“提交”而不引导“开始事务
  2. 如果 autocommit=0,“select”语句是否开始事务?

服务器信息:innodb engine autocommit=1(默认值) tx_isolation=repeatable-read(默认值)

通用日志:

100356 10:00:00 123456 Connect  dummy@172.0.0.1 on dummydb
123456 Query    SET NAMES 'utf8'
123456 Query    SET AUTOCOMMIT = 0
123456 Query    COMMIT
123456 Query    SET FOREIGN_KEY_CHECKS=1
123456 Query    SET sql_mode='NO_BACKSLASH_ESCAPES'
4

2 回答 2

7

呃......因为你禁用了自动提交????

这是一个很好的解释:

http://rpbouman.blogspot.com/2007/02/mysql-transactions-and-autocommit.html

启用自动提交后,每个语句都包含在自己的事务中。一条语句的成功执行后隐含地是一个 COMMIT,并且发生错误会中止事务,回滚任何更改。

默认情况下,自动提交在 MySQL 中启用。

换句话说:

  1. “事务”不一定只是“将多个语句作为一个原子实体执行”

  2. 自动提交给你一个语句的“错觉”== 1 笔交易

  3. 事实上,“automcommit off”为您提供“一个语句 == 0 个事务”

从同一个链接:

...关闭自动提交的全部意义在于您可以发出多个语句并一次全部提交。

于 2012-01-10T07:09:31.050 回答
3

在标准 SQL 中,您(几乎)总是在事务中。如果您执行 COMMIT 或 ROLLBACK,则下一条语句将启动一个新事务。因此,如果您希望更改生效,您必须提交它们。

如果您启用了 AutoCommit,则每条语句都是一个单例事务,如果成功则自动提交,如果失败则回滚。

当您关闭 AutoCommit 时,您必须 COMMIT 以确保数据库更改生效。

一些 DBMS 在这个主题上有细微的变化。

尤其是 Informix,有一种数据库模式,其中 AutoCommit 在您执行显式 BEGIN [WORK] 之前一直处于打开状态;那么你在一个事务中,直到你执行 COMMIT [WORK] 或 ROLLBACK [WORK]。它还有一个“MODE ANSI”,其行为与标准 SQL 中的一样;它有一个未记录的模式,根本没有交易。

尽管如此,您所展示的陈述并不是不言而喻的,确实需要交易支持。它往往是 DML 语句(SELECT、INSERT、DELETE、UPDATE、MERGE 等),有时是需要事务支持的 DDL 语句。一些 DBMS 不允许回滚 DDL 语句(Oracle);其他人做(Informix)。

于 2012-01-10T07:15:06.200 回答