我正在使用带有mysqldb适配器的web2py dal连接到mysql服务器。
我的问题:
服务器信息: 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'
答案 0 :(得分:7)
呃......因为你禁用了自动提交????
这是一个很好的解释:
http://rpbouman.blogspot.com/2007/02/mysql-transactions-and-autocommit.html
启用自动提交后,每个语句都包含在自己的语句中 交易。成功执行语句是隐含的 然后是COMMIT,发生错误就会中止 交易,回滚任何变化。
默认情况下,在MySQL中启用自动提交。
换句话说:
“Transactions”不一定只是“将多个语句作为一个原子实体执行”
autocommit为您提供一个声明的“幻觉”== 1交易
事实上,“automcommit off”为您提供“一个声明== 0个交易”
来自同一个链接:
... 自动提出关闭的重点是您可以发布 多个语句并一次提交它们。
答案 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)。