0

这些是模型:

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 失败,是否有可能在 raise_on_save_failure = false 处回滚 address.delete。

如果 raise_on_save_failure = true 但不想将其设置为 true,则事务会回滚。

4

1 回答 1

4

这是预期的行为。如果您想在 save 失败时显式回滚,即使 raise_on_save failure 为 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

Sequel-Talk Google 群组的参考链接:https ://groups.google.com/forum/#!topic/sequel-talk/Y9NuUUNwfyo

于 2014-04-01T18:29:23.233 回答