我已经设置了ActiveRecord事务,但是当第二个语句失败时,它不会导致事务失败。这是我的代码:
Contact.transaction do
contact = Contact.create(params)
channel = ContactChannel.create(contact: contact, phone: contact.phone)
# ContactChannel query raises a validation error
# puts "ERRORS: #{channel.errors.messages}" outputs the following:
# {:channel_key=>["has already been taken"]}
contact # Still returns the contact that was created
end
知道为什么即使验证错误,这也不会失败?
答案 0 :(得分:2)
create!
而不是create
应该引发异常,这会导致事务被回滚。它基本上是一个更严格的版本,如果没有引发异常,则事务不会失败。
要了解事务回滚的原因,可以将Transaction-statement包装在begin (...) rescue
- 块中并捕获ActiveRecord::Rollback
- 错误并使用其消息返回事务失败的原因