2010-10-25 37 views
1

如果我運行下面的PHP,我希望沒有價值被插入到測試表,因爲我有我還沒有提交的事務:在PHP中,如果我斷開而不提交,而不是提交,我可以讓MySQL回滾事務嗎?

$db = mysql_connect("localhost","test","test"); 
mysql_select_db("test"); 
mysql_query("begin transaction;"); 
mysql_query("insert into Test values (1);") or die("insert error: ". mysql_errror()); 
die('Data should not be commited\n'); 
mysql_query("commit;"); // never occurs because of the die() 

但相反,它似乎繼續提交。有沒有辦法關閉這種行爲,而不關閉自動提交的PHP不使用網站上其他地方的交易?

編輯:這只是一個愚蠢的錯字。它應該是「開始交易」或「開始」。不是「開始交易」。對不起,浪費人們的時間。

+0

在我安裝MySQL的,查詢「BEGIN TRANSACTION」給出了錯誤「您的SQL語法錯誤;檢查對應於您的MySQL服務器版本的手冊,以便在第1行'transaction'附近使用正確的語法「 – mellowsoon 2010-10-25 16:10:03

回答

2

使用mysql_query('BEGIN')。 SQL「BEGIN TRANSACTION」無效(實際上mysql_query在該查詢中返回false,這意味着有錯誤)。它不工作,因爲你永遠不會開始交易。

+0

哎呀!我的意思是輸入「開始交易」,而不是「開始交易」,當我修復它的工作。 – rjmunro 2010-10-25 16:09:49

+0

它總是*很簡單。 :) – mellowsoon 2010-10-25 16:10:49

1

的語法開始交易:

START TRANSACTION 

和你談話的功能有關 AUTOCOMMIT。如果你不想要的話,你就必須禁用它:

SET autocommit = 0 

參考可以在http://dev.mysql.com/doc/refman/5.1/en/commit.html

發現我也建議您測試所有的MySQL的返回值_...( ) 功能。你不能認爲他們會一直運行成功。

+0

是的。在生產代碼中,我測試了mysql函數的返回值,但這只是一個愚蠢的測試腳本,可以推向一個使用事務的同事,我們不需要通過代碼並在任何地方添加數百個回滾語句錯誤。現有的死亡陳述將會訣竅。 – rjmunro 2010-10-25 16:22:16

0

默認情況下,事務不會回滾。應用程序代碼負責決定如何處理此錯誤,無論是重試還是回滾。

如果你想自動回滾,這也是該手冊中解釋說:

The current transaction is not rolled back. To have the entire transaction roll back, start the server with the `--innodb_rollback_on_timeout` option. 
相關問題