没有“开始交易”的单个“提交”语句

时间:2012-01-10 07:03:28

标签: mysql transactions commit autocommit

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

我的问题:

  1. 为什么在“设置autocommit = 0
  2. 之后需要单个“提交”而不引导“开始交易
  3. 如果autocommit = 0,那么“select”语句是否会开始一个事务?
  4. 服务器信息: innodb引擎 autocommit = 1(默认值) tx_isolation = repeatable-read(默认值)

    general_log:

    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'
    

2 个答案:

答案 0 :(得分:7)

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

这是一个很好的解释:

  

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

     

启用自动提交后,每个语句都包含在自己的语句中   交易。成功执行语句是隐含的   然后是COMMIT,发生错误就会中止   交易,回滚任何变化。

     

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

换句话说:

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

  2. autocommit为您提供一个声明的“幻觉”== 1交易

  3. 事实上,“automcommit off”为您提供“一个声明== 0个交易”

  4. 来自同一个链接:

      

    ...   自动提出关闭的重点是您可以发布   多个语句并一次提交它们。

答案 1 :(得分:3)

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

如果启用了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)。