2013-04-06 81 views
1

我剛剛從MyISAM表切換到InnoDB,因爲行鎖定似乎比表鎖定更好。PHP&MySQL InnoDB:在插入或更新後數據不可用

問題是,現在我之前做的很多事情都不起作用。

例如,我有一個腳本根據用戶的瀏覽歷史向用戶推薦項目。這是通過將行插入或更新到建議表中完成的。建議的實際計算是通過SQL語句完成的。所以有時我會執行推薦聲明,然後立即(在相同的PHP腳本中)請求結果,以便它可以顯示給用戶。有了MyISAM,這個工作非常完美,但有了InnoDB,它有時會返回舊的結果,或者沒有結果(如果以前沒有的話)。

此外,我有一個表,作爲一個隊列的東西。要使用它,我執行並更新,然後選擇此更新的結果。它再次適用於MyISAM,但不適用於InnoDB。

如何確保在某些情況下行可以立即插入或更新?在其他情況下,如果它加快查詢速度,我會很滿意延遲插入或更新。但是在我所述的特殊情況下,我需要立即採取行動。有沒有一個PHP命令來做到這一點?或者它是否使用MySQL設置?

+0

您是否在多個節點上覆制數據庫? – decden 2013-04-06 06:26:58

+0

數據庫被複制到同一服務器上的另一個驅動器。爲什麼? – Alasdair 2013-04-06 07:06:03

+0

由於可能會將更改寫入主節點,因此與其他節點同步之前可能會查詢從節點(尚未收到更改)。但是,據我所知,你正在使用一個服務器實例,這不應該是問題。 – decden 2013-04-06 07:46:24

回答

1

聽起來好像自從搬到InnoDB http://dev.mysql.com/doc/refman/5.0/en/innodb-transaction-model.html以來可能會遇到交易問題。

與MyISAM不同,InnoDB支持隔離先前SQL命令的數據庫事務,直到您使用特殊的COMMIT sql命令提交它們。通常情況下,這不是問題,因爲您將在同一數據庫連接上運行同一事務,默認情況下啓用AUTOCOMMIT。 MySQL的自動提交功能將在數據更改後自動提交事務,例如在UPDATE之後。但是,我猜想你多次連接到數據庫(或者使用這樣做的庫),並且你的庫或配置禁用自動提交。

您可以通過在您的UPDATE後面發出SQL COMMIT並查看問題是否消失來輕鬆地進行測試。如果這是問題,那麼長期解決方案取決於您正在使用的庫,但通常您可以再次啓用自動提交(通過您的庫或通過從my.cnf或my.ini文件中刪除禁用的條目)或您可以最好是開始使用交易! 「MySQL數據交易教程」中有很多文章。

在執行SQL的其餘部分之前,您可以通過執行一次SQL SET AUTOCOMMIT=1;來啓用自動提交。

這一切都假定您沒有複製問題。

+0

嗨帕特里克,MySQL設置啓用了自動提交,但我會嘗試你所說的。我確實發現,即使斷開連接並重新連接到MySQL也不能解決問題。 – Alasdair 2013-04-06 07:11:18