在有关事务的rails指南中,它说sql语句如下所示:
ActiveRecord::Base.transaction do
david.withdrawal(100)
mary.deposit(100)
end
但这不是这个活跃的记录吗?有什么区别?
答案 0 :(得分:1)
我想在这里问david.withdrawal(100)
。这不是active_record也不是sql语句。它只是声明,以帮助用户了解在rails中使用事务。
您可以在事务块内使用活动记录。您也可以只使用rails方式编写sql语句。
使用事务,如果你有一些依赖的sql语句。如果任何一个都无法保存在DB中,那么其他语句也应该回滚。在这种情况下,我们使用了交易。
答案 1 :(得分:0)
您在ActiveRecord::Base.transaction
块中执行Ruby或Active Record方法或SQL的方式与在一个块外部执行方式相同。唯一的区别是,如果块中发生的任何数据库操作失败,则块中的所有其他数据库操作也将回滚。
Active Record是围绕SQL的Ruby包装器。要查看Active Record方法如何转换为SQL,请查看Active Record docs。
中的示例在您发布的示例中:
ActiveRecord::Base.transaction do
david.withdrawal(100)
mary.deposit(100)
end
可以假设 :withdrawal
和:deposit
是最终进行SQL调用的Active Record方法。取款依赖于存款,因此我们将它们包装在一个交易中,因此如果其中一个失败,另一个也将被回滚(取消)。