2012-07-07 348 views
3

我需要在MySQL項目中使用事務。但我不確定是否必須使用mysql_query("SET AUTOCOMMIT=0");
我知道我有兩個選擇:使用BEGIN和START TRANSACTION時的MySQL AUTOCOMMIT狀態

  1. BEGIN
  2. START TRANSACTION

我還聽說了這兩個項目的一個並不需要使用AUTOCOMMIT = 0
請幫我知道我何時需要使用AUTOCOMMIT = 0其實,有BEGIN還是用START TRANSACTION

謝謝。

+0

不使用mysql_ *函數 – 2012-07-07 14:47:00

+0

@隨機我不得不這樣做。我有一個用這種方式編寫的許多代碼行,並且很難改變它們。 – 2012-07-07 14:48:42

+0

但是你必須面對這個艱鉅的工作來爲你的用戶提供安全 – 2012-07-07 14:50:08

回答

9

the manual解釋說:

默認情況下,MySQL的運行啓用autocommit模式。這意味着只要執行更新(修改)表的語句,MySQL就會將更新存儲在磁盤上以使其永久保存。更改無法回滾。

隱含禁用自動提交模式單一系列的語句,使用START TRANSACTION聲明:

START TRANSACTION; 
SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 
UPDATE table2 SET [email protected] WHERE type=1; 
COMMIT; 

隨着START TRANSACTION,直到你COMMITROLLBACK結束事務自動提交保持禁用。自動提交模式然後恢復到之前的狀態。

該手冊接着說:

要明確禁用自動提交模式,使用下面的語句:

SET autocommit=0; 

autocommit變量設置爲零,禁用自動提交模式後,變化到交易安全表(例如InnoDBNDBCLUSTER)不會立即生效。您必須使用COMMIT將更改存儲到磁盤或ROLLBACK以忽略更改。

autocommit是會話變量,必須爲每個會話設置。要爲每個新連接禁用自動提交模式,請參閱autocommit系統變量的描述Section 5.1.3, 「Server System Variables」

BEGINBEGIN WORK作爲用於啓動事務的START TRANSACTION的別名而被支持。 START TRANSACTION是標準的SQL語法,並且是啓動臨時事務的推薦方式。

+0

謝謝eggyal。我在MySQL官方網站上看到過這篇文章。但是當我們使用'BEGIN'時,我看到一些文章,我們不需要設置'AUTOCOMMIT = 0',但是當我們使用'START TRANSACTION'時,我們必須這樣做。關於我所說的和這篇文章,你的想法是什麼? – 2012-07-07 18:21:47

+0

@MohammadSaberi:從手冊中可以很清楚地看到,當使用BEGIN或START TRANSACTION的任意一種時,不需要設置autocommit = 1。但是,如果您沒有'SET autocommit = 1',那麼您必須確保在每次事務處理之前顯式調用'START TRANSACTION'或'BEGIN'。 – eggyal 2012-07-07 18:32:03

+0

@eggyal你的意思是你**不需要在使用'START TRANSACTION'和/或'BEGIN'時不需要禁用自動提交?它會被自動禁用? – CMCDragonkai 2015-06-17 15:04:58

相關問題