Блок транзакции модели сиквела не откатывается при сбое сохранения (из-за проверки) и поднять_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/