2012-07-13 54 views
0

根據軌道涉及多個數據庫文件嵌套事務應該工作:Rails 3箇中ActiveRecord的嵌套事務使用多個數據庫

User.transaction do 
    User.create(:username => 'Kotori') 
    User.transaction(:requires_new => true) do 
    User.create(:username => 'Nemu') 
    raise ActiveRecord::Rollback 
    end 
end 

你會如何在傳播,這樣父事務也是嵌套事務具有回滾回滾?

謝謝

回答

1

首先,您的代碼不使用多個數據庫。兩者都使用來自客戶端模型的連接。

其次,您不指定DBMS。不同的數據庫驅動程序具有不同的屬性,並不是所有實現嵌套事務。你在使用哪個數據庫?

我只是做了你想做的事,我使用了兩個postgres數據庫。只要拋出ActiveRecord :: Rollback就會退出封閉事務,但不會引發進一步的異常。我想確保嵌套的事務是否失敗,然後外部的事件回滾。 因此,我在內部事務中捕捉到任何異常,然後從那裏引發回滾。

注意:帳戶和用戶模型使用不同的數據庫,儘管它們都運行在Postgres的相同實例中。另外,如果你省去了開始救援條款,那麼是的,你的代碼會回滾這兩個數據庫,但是在外部事務結束後,你將得到一個異常解除你的堆棧。最後,我認爲如果提交外部事務時出現問題,那麼內部事務將不會回滾。就我而言,這不是問題。您可能想要將DB1代碼包裝在嵌套事務中,並在啓動DB2事務之前將其提交。

Account.transaction do 
    begin 
    acc = Account.do_something_to_accounts 
    User.transaction do 
     User.do_something_to_users 
    end 
    rescue => e 
    raise ActiveRecord::Rollback 
    end 
end 
相關問題