【问题标题】:How to force commit nested transaction in rails (4.2)如何在 Rails (4.2) 中强制提交嵌套事务
【发布时间】:2021-10-09 22:50:25
【问题描述】:

我有嵌套事务示例。从Aclass call 方法,我在事务块中调用BClass call 方法。 现在在Bclass call 方法中直到Aclass call 方法事务块被完全执行后才提交事务。

如何强制Bclass call 方法提交事务。

class Aclass 
  def call 
    ActiveRecord::Base.transaction do 
      Bclass.call()  
      # other logic to  save some record 
    end 

    #publish event to Rabbit Queue 
    publish
  end   


class Bclass 
  def call 
    ActiveRecord::Base.transaction do 
      # save some record in.
    end

    #publish some event to rabbit queue
    publish 
  end
end 

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 activerecord


    【解决方案1】:

    最常用的 DBMS(包括 MariaDB、MySQL、PostgreSQL)本身不支持嵌套事务。即:数据库不支持你想做的事情。

    Rails 使用 SAVEPOINT 模拟嵌套事务的某些方面(特别是回滚能力),它充当事务中的快照。使用这些,您可以将事务的状态回滚到某个先前的保存点。但是,它们不允许在实际提交实际的“最外层”事务之前提交一些更改。只有这个最外层的事务才能真正提交更改,这些更改随后对其他并发事务可见。

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2023-03-04
      • 1970-01-01
      • 2019-06-08
      • 2017-10-20
      • 2016-03-01
      • 1970-01-01
      • 2011-06-04
      • 2015-07-31
      相关资源
      最近更新 更多