2013-06-24 68 views
2

我是使用事務的新手。關於PHP PDO的澄清選擇更新事務

基本上,我可以使用START TRANSACTION後跟一個SELECT ... FOR UPDATE語句成功鎖定MySQL控制檯中的單個行。該行仍然鎖定,直到我在控制檯

但是運行COMMIT命令,當我做同樣的使用$db->beginTransaction()隨後$db->execute("SELECT ... FOR UPDATE") PHP腳本,該行沒有得到之前,我運行一個腳本$db->commit()鎖定。

我的意思是即使在PHP中運行提交腳本來結束事務之前,我仍然可以在控制檯中成功執行SELECT ... FOR UPDATE語句。這是否意味着我的PHP腳本在事務過程中未成功鎖定行?我怎麼能檢查?

+0

當您嘗試檢查控制檯時,您確定您的事務仍處於打開狀態並且未被提交關閉嗎?可能是隔離級別的問題,所以默認值對於你的第一個和第二個例子是不一樣的......也許這可能有助於找出它們是不同的嗎? http://stackoverflow.com/questions/5347567/view-isolation-level-for-a-query-in-mysql – stef77

+0

我只是再次測試它。我絕對樂觀,我沒有通過PHP關閉事務,因爲我的腳本中沒有'$ db-> commit()'任何地方。但是爲什麼我能夠在關閉當前的PHP之前啓動其他事務?當我在控制檯中執行事務時,不會發生此問題。即使不運行'commit()'命令,PHP是否會自動關閉事務? – user2028200

回答

3

PHP分別在腳本結束後PDO自動關閉並回滾打開的事務,並且出於很好的理由 - 通常,您不希望在解析結束後保持事務處於打開狀態。在這裏看到:http://php.net/manual/en/pdo.transactions.php

當腳本結束時,或者當一個連接即將被關閉,如果你有一個未完成的事務,PDO將自動回滾。這是一種安全措施,可幫助避免在腳本意外終止的情況下出現不一致 - 如果您沒有明確提交事務,則認爲出現錯誤,因此將執行回滾以確保數據安全。

要進行測試,則可能會在execute後添加sleep(120),啓動PHP腳本,切換到MySQL控制檯併發出聲明那裏。我想你會遇到預期的鎖定。