新手问题 transaction 中 例如 create! 又包含在一个小的 begin..commit 中何解?

bajiudongfeng · 发布于 2016年08月31日 · 最后由 bajiudongfeng 回复于 2016年09月20日 · 1242 次阅读
14935

本来是希望能减少提交次数,可是为了保证能正确回滚,又要使用create!这种方法,然这个又包含在一个单独的transaction中,有没有比较好的方法来解决这个问题.谢谢!

共收到 6 条回复
2456

这是问题吗?

11178

你的意思是嵌套的 transaction?

4755

你是只想回滚单个资源,而不是整个外层 transaction?

14935

@zlx_star @jasonliu @martin91 谢谢! 之前可能没有说清楚! 例如如下代码:

ActiveRecord::Base.transaction do 
  base_template = BaseTemplate.create!(name:template_name,desc:template_desc)

  base_log = BaseLog.create!(name:log.name,desc:log.desc,path:log.paths,absolute_path:log.absolute_path,legal_name:log.legal_name,base_template_id:base_template.id)

  BaseCharpter.bulk_insert(set_size:100) do |work|
    charpters.each do |charpter|
      work.add({name:charpter.name,desc:charpter.desc,base_log_id:base_log.id})
    end
  end
  log.update!(custom_template:1,custom_template_id:base_template.id)
end

日志截图:

最外层的transaction里边的每个create!操作都又包含在一个小的transaction里边 我想问的就是能否减少commit次数

3287

create!方法判断是否保存成功抛出异常达到事务回滚,直接用create方法,手动判断是否成功抛出异常即可啊

ActiveRecord::Base.transaction do 
          base_template = BaseTemplate.create(name:template_name,desc:template_desc)
          raise ActiveRecord::Rollback if base_template.nil?
          base_log =         BaseLog.create(name:log.name,desc:log.desc,path:log.paths,absolute_path:log.absolute_path,legal_name:log.legal_name,base_template_id:base_template.id)
      raise ActiveRecord::Rollback if base_log.nil?
          BaseCharpter.bulk_insert(set_size:100) do |work|
            charpters.each do |charpter|
              work.add({name:charpter.name,desc:charpter.desc,base_log_id:base_log.id})
            end
          end
          log.update!(custom_template:1,custom_template_id:base_template.id)
        end
14935

@xxqfamous 谢谢!之前也是这样想的,就是想问问还有没别的方法。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册