2013-05-25 68 views
0

我們正在嘗試爲我們的生產環境實現分片。我們面臨的問題是我們推遲了正在照顧一些後臺處理的工作。如果我們更新模型並在延遲作業中爲延遲作業輸入條目,它將獲取該對象的較舊值並且不一致。例如用戶模型有姓名,職務,如果我想只要他改變了位置,它就像Rails mysql獲取舊值

usr = User.find(1) 
usr.position = "foo" 
usr.save 

延誤工作,如果我取USR = User.find(1)它是取舊觸發郵件值。我們在我們的生產環境中使用乘客,我們仍然使用Rails 2.3.18。在我們面對同樣的問題之前,我們的應用程序操作也是由mysql查詢緩存中的一個錯誤導致的,我們停止使用它並且問題在我們的應用程序動作中得到解決。

+0

DB級別或Rails級別的問題?我的意思是:如果你在數據庫上手工查詢,你是否得到正確的答案? – Idavod

+0

是的,我得到正確的價值,如果我直接從數據庫控制檯查詢(同樣的查詢,我從軌道記錄器獲得),如果我再次運行同樣的工作,它是無法獲取.. – user1956193

+0

保持此ActiveRecord :: Base.connection 。重啓!就在加載之前執行延遲作業解決問題..我不知道它爲什麼導致問題 – user1956193

回答

0

我能明確它是可重複讀通過MySQL的更多信息上 http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/

在我們的延遲工作要做,我們要保存它具有after_commit回調對象的問題。哪些事務處於開放狀態(因爲它是無效的),哪個既沒有提交也沒有發出回滾。我檢查了after_commit代碼,它們將禁用回滾,並且只有在出現異常的情況下才會執行回滾,只是在不拋出異常的情況下返回false。

0

這看起來像是一個緩存問題,有許多解決方法,在繼續前進並使整個緩存失效(對性能有影響)之前,我建議您在使用該對象之前發出usr.reload

問候,

+0

Idavod有時我們正在觸發一些延遲作業從對象創建,即使在那裏它根本沒有獲取保存的對象。我不能使用重新加載,因爲我會在查找本身時發生錯誤。我寫了一個新的重置方法 \t'def reset_with_change_user! \t \t如果@ connection.respond_to?(:CHANGE_USER) @ connection.change_user(@config [:用戶名],@config [:密碼],@config [:數據庫]) 端 end' 其中i除去實際上配置基本上設置utf-8和SET SQL_AUTO_IS_NULL = 0的連接工作正常。 – user1956193