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