TL; DR - MySQL不允許您鎖定表並同時使用事務。有沒有辦法解決?MySQL:如何鎖定表並啓動事務?
我有一個MySQL表我用來緩存一些(慢)外部系統的數據。這些數據用於顯示網頁(用PHP編寫)。每隔一段時間,當緩存的數據被認爲太舊時,其中一個網絡連接應該會觸發對緩存數據的更新。
有三個問題,我不得不面對:
- 其他客戶端將嘗試讀取緩存中的數據,而我更新它
- 多個客戶端可以決定緩存的數據太舊,並嘗試同時
- PHP的情況下做的工作可以在任何時候意外終止更新,數據不應該被破壞
我能解決的第一個和最後通過使用事務處理問題,因此客戶將能夠讀取舊數據,直到事務提交,並立即看到新數據。任何問題只會導致事務回滾。
我可以通過鎖定表來解決第二個問題,以便只有一個進程有機會執行更新。當其他進程獲得鎖定時,他們會意識到他們已經被擊敗了,並且不需要更新任何東西。
這意味着我需要同時鎖定表和開始交易。根據MySQL手冊,this is not possible。啓動事務將釋放鎖,並鎖定表提交任何活動的事務。
有沒有辦法解決這個問題,還是有另一種方法來完成我的目標?
謝謝,這似乎工作得很好! – Malvineous