2012-06-08 68 views
1

我正在研究用PHP和Mysqli編寫的複雜數據庫應用程序。對於大型數據庫操作,我使用在後臺工作的守護進程(也是PHP)。在這些可能需要幾分鐘的操作中,我想阻止用戶訪問受影響的數據,並向他們顯示消息。PHP/MySQL:暫時插入行

我想過創建一個Mysql表並在每次發生特定的守護進程時插入一行。然後,我總是能夠檢查某個操作是否在嘗試訪問數據時發生。

但是,如果守護進程因任何原因終止(從控制檯終止,丟失數據庫連接,拔出插件等),記錄不會留在數據庫中是很重要的。我不認爲Mysql事務/回滾能夠做到這一點,因爲提交是必要的,以便公佈更改並且記錄將在數據庫中保留,如果終止。

有沒有辦法確保記錄被刪除,如果進程終止?

+1

所有守護進程都託管在一臺服務器上嗎? – arik

+0

是的,現在所有東西都託管在一臺服務器上。但是當應用程序公開時,我會將數據庫移動到一個單獨的服務器上。 – 1nsane

+0

好吧,如果所有守護進程都在一臺服務器上,無論數據庫的服務器如何,您都可以簡單地更新文件並寫入更新時間。檢查文件中保存的時間戳是否小於10秒,如果是,則不允許執行任何操作。這樣,您應該在守護進程運行時更新該文件,即使它以非正統方式終止,也不會影響後續處理。 – arik

回答

2

這是一個有趣的問題,我實際上在幾年前實施了大學課程。

我使用的技巧是玩事務隔離。如果你的守護進程創建記錄表明他們正在進行,但不提交,那麼你說其他客戶端不會看到該記錄是正確的。但是,如果您將該客戶端的隔離級別設置爲READ UNCOMMITTED,您將看到該記錄表明正在進行 - 因爲READ UNCOMMITTED將顯示來自其他未提交的客戶端的更改。 (守護進程將保留默認的隔離級別)。

你應該設置客戶端的隔離級別讀取未提交該守護進程僅檢查,而不是它的其他工作,因爲它可能是非常危險的。

如果守護程序崩潰,事務會中止並記錄。如果成功,它可以標記它在數據庫中完成或刪除記錄等,然後它提交。 這真的很不錯,因爲如果守護進程因任何原因失敗,它所做的所有更改都會顛倒過來,並且可以重試。

如果你需要更多的解釋或代碼我也許能在某處找到我的任務:)

Transaction isolation levels reference

注意,這一切都需要的InnoDB或任何良好的事務數據庫。

+0

看起來很有趣。我會試一試:) – 1nsane

+0

工作得很好,謝謝。以下是使用事務隔離來確保我的守護進程不能一次執行多次的簡短示例。 – 1nsane

+0

我現在不允許發佈它。我將在稍後發佈;) – 1nsane