新手问题 关于 transaction 事物问题

匿名 · 2012年11月05日 · 最后由 Guest 回复于 2012年11月15日 · 3083 次阅读

比如有这么一段代码

A.transaction do B.destroy C.destroy D.destroy end

如果其中 c 删除失败,是 A 进行回滚,b 是被删除的,从 c 开始终止,还是包在事务中的操作都回滚,包括 A 也回滚呢?

希望能确定答案的给个答案,不了解或者不太确定的不要乱说哦。在实际开发中遇到的疑问,又是删除,搞不好会出大事的。谢谢了

自己不能看文档,或者直接写一段测试?

既然是事务,肯定要遵守事务的特性,ACID。 这段代码和 A 没有关系,你的 destroy 只是 BCD。原子性!要么都删除,要么都回滚!!

#2 楼 @woaigithub 是不是应该这样才对的?

B.transaction do
B.destroy
C.destroy
D.destroy
end

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 里进行事务的差别而已?

匿名 #10 2012年11月15日

太感谢各位的热心回答了,感激中

需要 登录 后方可回复, 如果你还没有账号请 注册新账号