2014-05-09 82 views
4

是否有可能強制ActiveRecord推/刷新事務(或只是一個保存/創建)?如何強制Rails的ActiveRecord提交事務刷新

我有一個時鐘工作者,在幾個任務工作人員的後臺創建任務。問題是,時鐘工作者有時會創建一個任務,並在時鐘工作人員信息完全刷新到數據庫之前將其推送給任務工作人員,這會導致惡劣的競爭條件。

由於產品的體系結構以及如何生成任務,使用after_commit並不真正可行。

所以簡而言之,我需要能夠讓一個工作者創建一個任務並將該任務清理到數據庫。

回答

6

ActiveRecord使用#transaction創建一個開始並回滾或提交事務的塊。我相信這會幫助你解決問題。從本質上講(假定任務是ActiveRecord類):

Task.transaction do 
    new_task = Task.create(...) 
end 

BackgroundQueue.enqueue(new_task) 

你也可以直接去#connection下方有:

Task.connection.commit_db_transaction 

這是一個有點低級別的,不過,你必須非常對代碼的使用方式充滿信心。 #after_commit是最好的答案,即使需要稍微調整代碼才能使其正常工作。如果它不能工作,那麼這兩種方法應該有所幫助。