我有一组插入和更新,如果其中任何一个失败,都需要回滚。这些更新和插入的很大一部分被抽象出来,因此可以重复使用。当我启动一个事务,然后调用该方法启动抽象插入时,失败不会发送到原始事务块 - 它只是在该方法之前提交所有内容
def decline_check
Check.transaction do
# Set default updates, then a voided date if the check has already been printed.
check_attributes = {:status => 'Voided', :status_date => Time.now.strftime('%Y-%m-%d')}
check_attributes[:voided_date] = Time.now.strftime('%Y-%m-%d') if check.status == "Printed"
# Update check status
check.update_attributes!(check_attributes)
decline(current_user)
end
end
private
def decline current_user
# execute some insert here that fails
end
如何在decline
中进行回滚以在decline_check
中触发回滚?
答案 0 :(得分:0)
如果要手动触发事务回滚,可以raise ActiveRecord::Rollback
。
更好的设计是在进行数据库交互之前尝试找到一种验证方法。
您在decline current_user
中的评论表示插入内容将失败。如果您正在引用数据库级别故障,它应该自动触发回滚。