2014-04-01 12 views
0

這些是模型:續集模型事務塊不rollbacked raise_on_save_failure =假

class User < Sequel::Model 
    self.raise_on_save_failure = false 
end 

class Addresses < Sequel::Model 
    many_to_one: user 
    self.raise_on_save_failure = false 
end 


address = Addresses.find(id: 1) 

user = address.user 

DB.transaction do 
    address.delete 
    user.save 
end 

在上面的代碼,如果user.save返回nil一些驗證失敗交易不是回滾 ,該地址仍然被刪除。

是否有可能,如果user.save失敗,address.delete是rollbacked raise_on_save_failure = false。

如果raise_on_save_failure = true,但事務不會回滾,但不想將其設置爲true。

回答

3

這是預期的行爲。如果即使raise_on_save失敗爲false,也希望在保存中顯式回滾失敗,那麼您有兩個選項。一個是使例外特定的保存:

DB.transaction do 
    address.delete 
    user.save(:raise_on_failure=>true) 
end 

二是明確回滾,如果你發現一個保存失敗:

DB.transaction do 
    address.delete 
    raise Sequel::Rollback unless user.save 
end 

參考鏈接到續集通話谷歌羣組:https://groups.google.com/forum/#!topic/sequel-talk/Y9NuUUNwfyo