2012-01-10 73 views
2

我正在使用web2py dal與mysqldb適配器連接到mysql服務器。沒有「開始事務」的單個「提交」語句

我的問題:

  1. 爲什麼它需要一個單一的 「提交」 沒有領先後 「開始交易」 「一套自動提交= 0
  2. 沒有 「選擇」 的聲明開始一個事務,如果autocommit = 0?

服務器信息: InnoDB引擎 自動提交= 1(默認值) TX_ISOLATION =重複讀取(默認值)

general_log:

100356 10:00:00 123456 Connect [email protected] 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' 

回答

7

呃......因爲你禁用自動提交????

這裏有一個很好的解釋:

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

自動提交啓用,每個語句都是在其自己的 事務中包裹着。語句的成功執行是隱含地 ,後跟一個COMMIT,並且發生錯誤會中止事務,回滾所有更改。

默認情況下,在MySQL中啓用自動提交。

換句話說:

  1. 「交易」不一定只有「執行多個語句作爲一個原子實體」

  2. 自動提交給你一個說法「錯覺」 == 1交易

  3. 其實「automcommit off」給你「一個語句== 0個交易」

從相同的鏈接:

... 已經關閉自動提交的全部要點是,你可以發出 多條語句並提交他們的一次。

+0

謝謝jonathan。所以在這種情況下隱含地發佈「開始」。另一個問題:會話A中的「提交」聲明是否將會話B中的已提交更改引入會話A? (tx_isolation =可重複讀取) – 2012-01-10 08:10:30

+0

這是Paul的答案......但是,在COMMIT之後,你開始一個新的事務,所以你也可以看到自從你開始前面的事務以來,其他人對數據庫的改變。 – 2012-01-10 15:14:14

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)。

相關問題