本来要问的是下面这一段,自己看完文档明白了。
[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]。
[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]。