Блок транзакции модели сиквела не откатывается при сбое сохранения (из-за проверки) и поднять_on_save_failure = false

Это модели:

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 откатывается, где lift_on_save_failure = false.

Транзакция выполняет откат, если повысить_on_save_failure = true, но не хочет устанавливать значение true.

1 ответ

Решение

Это ожидаемое поведение. Если вы хотите явно откатить при сбое сохранения, даже если сбой в виде_съявления равен 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

Ссылка Ссылка на группы Google Sequel-Talk: https://groups.google.com/forum/

Другие вопросы по тегам