如何在 rails 中强制提交嵌套事务 (4.2)



我有嵌套事务示例。从Aclass#call方法,我在事务块中调用BClass#call方法。 现在Bclass call方法在方法事务块完全执行之前Aclass call不会提交事务。

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

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

class Bclass
def call
ActiveRecord::Base.transaction do
# save some record in.
end
#publish some event to rabbit queue
publish
end
end

最常用的DBMS(包括MariaDB,MySQL,PostgreSQL)本身不支持嵌套事务。也就是说:数据库不支持你想要做的事情。

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

最新更新