首先可以自己选择自己的数据源连接池等。
以JDBC和mybatis为例,使用DataSourceTranscationManager,不管哪种Manager都是PlatformTransactionManager的具体实现类。
使用注解方式:
@Bean("myDataSource")
DataSource DataSource(){
return new DataSource();//类似
}
@Bean
public DataSourceTranscationManager dataSourceTranscationManager(@Autowired @Qulifier("myDataSource") DataSource source ){
return new DataSourceTranscationManager(source);
}
在启动类添加注解 @EnableTranscationManagement。
在需要开启事务的类或者方法上添加注解 @Transcational。
@Transcational几个重要的属性:
枚举属性Propagation:
REQUIRED:支持一个现有的事务,如果没有则新建一个。
SUPPORTS:支持一个现有的事务,如果没有则不做事务处理。
MANDATORY:支持一个现有的事务,如果没有则抛异常。
REQUIRES_NEW:新建一个事务,如果已存在则挂起已存在事务。
NOT_SUPPORTED:不做事务处理,如果已存在则挂起已存在事务。
NEVER:不做事务处理,如果已存在则抛出异常。
NESTED:如果有一个事务存在,做一个嵌入式的事务。
rollbackFor
rollbackForClassName
noRollbackFor
noRollbackForClassName
由名字可知,有着相似的作用。分别是异常名称 异常类型 已经是否回滚的选择,必须是Throwable及其子类。
- 如果对于数据库操作try/catch 则不会回滚,因为异常被捕获了,必须在catch中手动throw出异常,才能进行回滚
- 如果在同一个类中的A方法调用B方法,那么如果在B方法上使用@Transcational,或者其他类似的调用关系,则会因为SpringAop的机制问题而无效。解决方法:
https://stackoverflow.com/questions/3423972/spring-transaction-method-call-by-the-method-within-the-same-class-does-not-wo