2010-01-18 51 views
4

考慮:的MySQL/PHP的交易行爲

mysql_query("START TRANSACTION"); 
mysql_query("UPDATE foo = 'bar'"); 
die(); 

die()之前,我可以COMMITROLLBACK停止交易。看看我的表,看起來更新不會發生,但如果我稍後在另一個腳本中運行查詢,他們仍然是該初始事務的一部分嗎?直到我COMMITROLLBACK交易仍然「開放」?

回答

4

如果死亡連接到mysql然後是,交易是關閉的。如果你剛剛離開交易掛起,但你會遇到麻煩。

我會建議確保事務和提交在相同的mysql_query中,如果在所有人類可能的情況下確保它實際發生。

+0

返回一致的值根據http://www.php.net/manual/en/function.mysql-close客戶.php: 「通常不需要使用mysql_close(),因爲在腳本執行結束時,非持久性的打開鏈接會自動關閉。「 由於die()結束腳本的執行,我會假設這意味着數據庫連接已關閉? – Matthew 2010-01-18 16:24:11

+0

不幸的是,我沒有使用mysqli,所以我不能一次做多個查詢。 – Matthew 2010-01-18 16:45:49

+0

這是正確的,我只是想知道你是否真的會徹底忠實於你的交易被打開後總是死去。我的意思是,你真的會在真實生活場景中死去多久?這就是爲什麼我提到你可能不應該依靠die()來爲你關閉交易。 – 2010-01-19 05:55:31

1

這取決於您的序列化級別。如果事務既沒有提交也沒有回滾,它應該在一段時間後超時並回滾到DB中。但在此之前,這是一個未完成的事務,可能會導致其他不可序列化事務中的選擇不一致。依賴於它的level

  • 讀取未提交:您可以讀取未提交的,未完成的值,直到回滾
  • 重複讀(MySQL的默認):你不會讀未提交值,但範圍沒有被鎖定,一個SELECT COUNT(*)FROM WHERE 18 <年齡和< 24歲,不能保證到回滾