关于Spring的事务管理,如果使用默认配置会导致数据库中的数据出现异常时,整个事务会被回滚,包括正常执行的数据也会被回滚,这种情况下可能会造成严重的数据丢失。以下是我总结出的关于这个问题的完整攻略:
问题分析
在 Spring 中,默认情况下,使用 @Transactional 注解添加的事务会使用最悲观的隔离级别(TransactionDefinition.ISOLATION_DEFAULT),设置了自动回滚(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)。
解决方案
方案一:只回滚异常的操作
不是所有的操作都需要回滚,有些操作可以继续进行。我们可以通过标记异常来决定是否回滚事务。我们可以通过设置 @Transactional 注解的 rollbackFor 属性,来指示需要回滚的异常:
@Service
public class MyService {
@Transactional(rollbackFor = MyException.class)
public void func() throws MyException {
// some code
}
}
在这个例子中,如果抛出了 MyException 异常,就会回滚当前事务。
方案二:多事务管理器来管理数据源
使用多个事务管理器来分别管理不同的数据源,这样就能保证每个数据源独立进行事务管理。以下是一个使用多个事务管理器的示例:
@Configuration
public class DataSourceConfiguration {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public PlatformTransactionManager primaryTransactionManager() {
return new DataSourceTransactionManager(primaryDataSource());
}
@Bean
public PlatformTransactionManager secondaryTransactionManager() {
return new DataSourceTransactionManager(secondaryDataSource());
}
}
在这个例子中,我们使用了两个数据源,每个数据源都有自己的事务管理器。这样做可以保证每个数据源在事务管理时是独立的。
总结
以上是关于 Spring 的 @Transactional 导致数据库回滚全部生效问题的完整攻略。我们可以通过设置 rollbackFor 属性或者使用多个事务管理器来解决这个问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Spring的@Transaction导致数据库回滚全部生效问题(又删库跑路) - Python技术站