使用(宁静)导轨时,事务何时开始
时间:2020-03-06 14:38:00 来源:igfitidea点击:
整个宁静动词是否都在一个包含所有事物的交易中?也就是说,如果在处理UPDATE,DELETE或者CREATE操作的任何时候在验证或者回调中引发错误,我在先前的回调中可能执行的每个数据库操作是否也会回滚?简而言之,是否在任何回调或者验证上引发错误,是否使该动词操作在数据库中根本没有发生变化?
解决方案
一些方法(创建,销毁)会立即进入数据库。通过使用事务方法对从ActiveRecord派生的类进行事务处理,如下所示:
Student.transaction do Course.transaction do course.enroll(student) student.units += course.units end end
(此示例适用于多个数据库。对于单个数据库,我们仅需要一个事务。)
然后,我们可以回滚这些事务,并且回滚后会传播事务中引发的异常。
这取决于数据库是否具有事务。
注意:保存和销毁被包装在事务中。
默认情况下,事务中没有编写数据库代码,我们需要在代码中告诉它这样做。
def create Model.transaction do Model.create!(params[:model]) Model.association.create!(params[:association]) end rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid flash[:notice] = "That record could not be saved." render :action => "new" end
使用#create!方法将尝试保存记录,如果失败,则将引发异常,该异常将回滚事务块内已执行的所有代码。
如果我们不执行该操作,则会将我们重定向到(我认为)公共目录中的405.html(如果存在)。
Is it the case that the entire restful verb is under a single all encompassing transaction?
不
if I raise a Error in the validation or callbacks at any point in the handling of a UPDATE, DELETE, or CREATE operation, is every database operation that I may have performed in previous callbacks also rolled back?
不。
does raising a Error on any callback or validation make it such that no change at all occurs in the database for that verb action?
不。
如果我们希望这种行为,则可以在控制器中显式创建事务(请参见其他用户提供的示例),也可以使用" around_filter"将行为添加到所有轻松的行为。