2011-03-03 91 views
4

雖然我找不到任何東西,但我想我會仔細檢查 - 是否支持memcache交易?與交易的Memcache?

如果沒有,我敢打賭是可能的答案,那麼在交易環境中使用memcache處理的正確方法是什麼?即使數據在緩存中,每次計劃更新時都不需要從數據庫中讀取數據,只需要設置鎖定即可?例如,更新某些數據的腳本如下所示:

  1. BEGIN; SELECT ... FOR UPDATE;
  2. 計算...
  3. UPDATE TABLE ...;
  4. 更新緩存
  5. COMMIT;

我想你必須在運行更新查詢後更新緩存,以防萬一遇到死鎖並需要回滾。但是,在提交之前,您還應該更新緩存,以防其他線程正在等待讀取您的數據,並且可能會意外更新緩存,甚至在您之前使用更新的數據來更新緩存,導致現在過時的數據覆蓋它。

這是正確的步驟順序嗎?有什麼辦法可以不必在打開數據庫時更新數據?

回答

4

Memcache確實有一個名爲CAS(檢查和設置 - 或比較和交換)的操作符,它可以幫助你。 PHP手冊上有一些文檔,Memcached::cas,但它也應該在其他庫和語言中得到支持。

0

Memcached不支持這種意義上的事務,儘管它的操作是原子操作。您可以使用數據庫事務處理機制並手動更新緩存(如您指定的那樣),也可以使用事務處理包裝器(如this)。