如何处理spring事务与多数据源冲突问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理spring事务与多数据源冲突问题?相关的知识,希望对你有一定的参考价值。

@Transactional(rollbackFor = Exception.class)
@Override
public void test(String name) throws IOException
DynamicDataSource.setDbType("dataBase2");//采用第二个数据源的配置
mapper.insert(name);//写入第二个数据源
//....其他写入业务

在启用事务的时候会写入到第一个数据源(默认的数据源database1),不会写入到dataBase2,取消@Transactional(rollbackFor = Exception.class)注解后能切换到database2。请问该问题的根源是什么?该如何处理?

参考技术A 事务处理的时候切到了数据源,你是不是哪里配置了。在使用的时候在方法上加@Transactional会自动使用dataSource数据源

清洁架构 - 如何处理数据库事务?

【中文标题】清洁架构 - 如何处理数据库事务?【英文标题】:Clean Architecture - how to address database transactions? 【发布时间】:2018-01-08 17:54:41 【问题描述】:

在“干净架构”中,交互器(用例)负责定义业务逻辑。大多数示例都以这样的方式定义用例:

public MyUseCase() 

  public boolean execute(...) 
    int id = repository.insert(a)
    if(id > 0) 
      b.aId= id;
      repository.insert(b);
      ...
    
  

交互器主要使用简单的 CRUD 之类的操作或对存储库的查询。 为简单起见,上面的示例是同步的,但您可以使用回调或 rxjava 等异步解决方案以相同的方法找到 repos。

但是用例的不完整性怎么办。例如,您不能 100% 确定插入 a 后,当您插入 b 时它仍然存在。 如果在插入 a 后,您在插入 b 时遇到 RepositoryException 怎么办。

到目前为止我看到的所有回购都没有考虑到它,所以我的问题是:

上述干净架构问题的解决方案是什么?

【问题讨论】:

【参考方案1】:

这个答案可能有点晚了,但我一直在努力解决同样的问题并得出结论,事务管理实际上是用例的一部分 - 例如,“如果 B 出现问题,则恢复 A 的状态”。因此,它可以而且应该在您的 UseCase 中明确说明,可能使用某种“DataManagerRepo”,如下所示:

public MyUseCase() 

    public boolean execute(...) 
        dataManagerRepository.openTransaction()
        try 
            int id = repository.insert(a)
            if(id > 0) 
            b.aId= id;
            repository.insert(b);
            ...
        
        catch (MyException exc) 
            dataManagerRepository.rollbackTransaction()
        

        dataManagerRepository.commitTransaction()
    

名称可能会有所不同以抽象出完整性机制,但想法是相同的。我希望这会对某人有所帮助。

【讨论】:

如果一个用例包含两个或多个用例,该解决方案将如何工作?如果单个用例需要跨两个或多个存储库运行,此解决方案将如何工作? 可以添加你的dataManagerRepository的代码吗? @SeanStayns 它不存在,都是我编的

以上是关于如何处理spring事务与多数据源冲突问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理列名('hash')与 Rails 冲突的旧数据库表?

您通常如何处理数据库事务日志?

清洁架构 - 如何处理数据库事务?

Npgsql 如何处理失败的事务?

Mysql精华问答| 分库分表之后,ID主键及事务如何处理

师妹面试被问到Spring如何处理循环依赖,我花了一晚上给她安排的明明白白