rails6 支持多数据库以来,发现使用ActiveRecord::Base.transaction来处理跨数据库的事务时,不起作用。
ActiveRecord::Base.transaction
出现异常后也不会全部 rollback。
请问在这种情况下有没有什么别的方法解决这个问题?
主动 raise 一下 Rollback 试试?
ActiveRecord::Base.transaction do begin tableA.create(:dataA => dataA) tableB.create(:dataB => dataB) # 让这条触发error rescue raise ActiveRecord::Rollback end end
试过,只 rollback 了触发错误的那个数据库连接的数据,没有 rollback 另一个数据库的数据
跨数据库只能是分布式事务
跨数据库的只能用分布式事务机制,并且没有完美的方案,只能尽量减少出错,如果设计金钱的,对账系统必不可少。
自己写一个 TCC(try confirm cancel) 的功能也挺好写的不太麻烦
TCC(try confirm cancel)