比如有这么一段代码
A.transaction do B.destroy C.destroy D.destroy end
如果其中 c 删除失败,是 A 进行回滚,b 是被删除的,从 c 开始终止,还是包在事务中的操作都回滚,包括 A 也回滚呢?
希望能确定答案的给个答案,不了解或者不太确定的不要乱说哦。在实际开发中遇到的疑问,又是删除,搞不好会出大事的。谢谢了
自己不能看文档,或者直接写一段测试?
既然是事务,肯定要遵守事务的特性,ACID。 这段代码和 A 没有关系,你的 destroy 只是 BCD。原子性!要么都删除,要么都回滚!!
Active Record Transactions http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
#2 楼 @woaigithub 是不是应该这样才对的?
B.transaction do B.destroy C.destroy D.destroy end
http://api.rubyonrails.org/classes/ActiveRecord/Transactions.html transaction 是一个 module
http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
ActiveRecord::Base.transaction do david.withdrawal(100) mary.deposit(100) end
写 A.transaction 也可以,只是开启一个事务,并不针对具体的 model,下面的操作才是具体的 model。
#7 楼 @woaigithub 就是说这样写会比较完善?
ActiveRecord::Base.transaction do B.destroy C.destroy D.destroy end
文档里说: In this example a balance record is transactionally saved even though transaction is called on the Account class:
Account.transaction do balance.save! account.save! end
The transaction method is also available as a model instance method. For example, you can also do this:
balance.transaction do balance.save! account.save! end
其实是不是第一句是用哪个都没有关系的?只是在那个 model 里进行事务的差别而已?
是这样的
太感谢各位的热心回答了,感激中