对rails里transaction的嵌套处理方式不解

本来要问的是下面这一段,自己看完文档明白了。
[quote]
#before do it: a.name="a"
a = A.find(1)
a.name="b"
a.save

上面这段代码在普通的rb文件里,是可以正常更新数据的。
在test.rb里,每次执行完以后数据都没有更新,也就是说rollback事务了。

在test_helper.rb里是这样说的:
#Transactional fixtures accelerate your tests by wrapping each test method
# in a transaction that's rolled back on completion. This ensures that the
# test database remains unchanged so your fixtures don't have to be reloaded
# between every test method. Fewer database queries means faster tests.

修改 self.use_transactional_fixtures = false 就可以更新数据了。
[/quote]

[b]但还有另外一个问题,就是说我手工控制事务的回滚和提交该如何做呢?[/b]
现在是这样用事务:
ActiveRecord::Base.transaction do
  SELECTAA
  UPDATEAA
  SELECTBB
  UPDATEBB
rescue
ensure
end

我想实现的是,当查找到BB的时候,由于某种原因需要回滚整个事务。但是在上面的语句中,是只有在出现异常的时候才回滚的吧?如果在里面加上raise "xxxx",也可以实现回滚。但是除此之外,有没有可以手工控制的语句呢?
就像在TEST中,可以设置事务是否自动回滚一样。

[b]后记:cookoo的回复[/b]
ActiveRecord::Base.connection.begin/commit/rollback_db_transaction

再测试一下事务嵌套效果:
ActiveRecord::Base.connection.begin_db_transaction
  ActiveRecord::Base.transaction do
  end
ActiveRecord::Base.connection.commit_db_transaction
[color=red]执行结果是:begin begin commit commit[/color]

反过来:
ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.begin_db_transaction
  ActiveRecord::Base.connection.commit_db_transaction
end
[color=red]执行结果是:begin begin commit commit[/color]

但是在_test.rb中加入
ActiveRecord::Base.transaction do
end
[b]语句时,却仅执行外围的begin/commit/rollback,上面这条transaction do end中根本没有开启事务语句。相当于被外围接管了[/b]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值