本来是希望能减少提交次数,可是为了保证能正确回滚,又要使用 create! 这种方法,然这个又包含在一个单独的 transaction 中,有没有比较好的方法来解决这个问题。谢谢!
这是问题吗?
你的意思是嵌套的 transaction?
你是只想回滚单个资源,而不是整个外层 transaction?
@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 次数
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
@xxqfamous 谢谢!之前也是这样想的,就是想问问还有没别的方法。