Spring 启动回滚多数据源
Spring boot rollback multi datasource
我的服务在 2 个数据库 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 不共享数据库之间的事务。
我如何实现这种行为?
关于我构建的数据库配置:
@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);
}
我的服务在 2 个数据库 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 不共享数据库之间的事务。
我如何实现这种行为?
关于我构建的数据库配置:
@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);
}