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 が失敗した場合、address.delete は raise_on_save_failure = false でロールバックされます。

raise_on_save_failure = true の場合、トランザクションはロールバックしますが、true に設定したくありません。

4

1 に答える 1

4

これは予期される動作です。raise_on_save の失敗が false であっても、保存が失敗したときに明示的にロールバックしたい場合は、2 つのオプションがあります。1 つは、その特定の保存の例外を有効にすることです。

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

2 つ目は、保存の失敗を検出した場合の明示的なロールバックです。

 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 に答える