代码之家  ›  专栏  ›  技术社区  ›  cvdr

Spring boot回滚多数据源

  •  0
  • cvdr  · 技术社区  · 7 年前

    我的服务在oracle和postgresql数据库中执行删除操作。当其中一个存储库引发异常时,另一个存储库不会回滚。

    例子:

    public MyService { 
    @Autowired private OracleRep oracleRep;
    @Autowired private PostgreRep postgreRep ;
    
    @Transactional
    public void delete(Long id){
    
        oracleRep.delete(id);
        postgreRep.delete(id);
    }
    }
    
    public OracleRepImpl { 
    
    @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate ;
    
    public void delete(Long id){
        //do delete
    }
    }
    
    public PostgreRepImpl { 
    
    @Autowired private @Qualifier("postgresql")NamedParameterJdbcTemplate namedParameterJdbcTemplate ;
    
    public void delete(Long id){
        //do delete
    }
    }
    

    我想注释@Transactional不会在数据库之间共享Transactional。

    如何实现此行为?

    1 回复  |  直到 7 年前
        1
  •  2
  •   cvdr    7 年前

    在数据库配置上,我构建了以下内容:

    @Bean(name = "postgresqlTransaction")
    
     public DataSourceTransactionManager  postgresqlDataSourceTransactionManager(@Qualifier("postgresqlDataSource") DataSource datasource) {
        return new DataSourceTransactionManager(datasource);
    

    }

    然后我构建一个注释

    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Transactional("postgresqlTransaction")
    public @interface TransactionalPostgresql {
    }
    

    现在:

    @TransactionalPostgresql 
    @Transactional
    public void delete(Long id){
    
        oracleRep.delete(id);
        postgreRep.delete(id);
    }