Spring事务的使用
@Transactional
public void test(){}
使用@Transactional注解在方法上,即可使得方法以事务的形式运行,当发生UnChecked的错误时,就会回滚。注意,如果能够被try不过的异常时不会回滚事务的,可以通过roolbackFor指定异常,捕获后回滚,或者使用
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();手动设置回滚
@Transactional(rollbackFor = RuntimeException.class)
public void test(){
try{
...
}
catch(Exception e){
//手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
- 多数据原事务
如果存在多个数据原,可以通过指定Transactional的Value指定数据原
@Bean(name = "order")
public DataSourceTransactionManager order(){
return new DataSourceTransactionManager(dataSource());
}
@Bean(name = "account")
public DataSourceTransactionManager account(){
return new DataSourceTransactionManager(dataSource());
}
public class TransactionalService {
@Transactional("order")
public void setSomething(String name) { ... }
@Transactional("account")
public void doSomething() { ... }
}
隔离级别
spring的隔离级别比InnoDB的隔离级别多了一个:default,就是使用数据库的隔离级别。
- TransactionDefinition.ISOLATION_DEFAULT:默认,使用数据库的隔离级别。
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED:读未提交
- TransactionDefinition.ISOLATION_READ_COMMITTED:读已提交
- TransactionDefinition.ISOLATION_REPEATABLE_READ:可重复读
- TransactionDefinition.ISOLATION_SERIALIZABLE:串行执行
七种传播机制
- PROPAGATION_REQUIRES:如果已有事务,就在事务中运行,否则新建一个事务
- PROPAGATION_SUPPORTS::如果已有事务,就在事务中运行,如果没有事务,则以非事务执行。
- PROPAGATION_MANDATORY:如果已有事务,就在事务中运行,否则抛出异常
- PROPAGATION_REQUIRES_NEW:如果已有事务,则挂起当前事务,否则新建事务
- PROPAGATION_NESTED:如果已经有事务,则嵌套一个事务(单独回滚或提交),否则开始新的事务
- PROPAGATION_NOT_SUPPORTED:非事务方式执行,如果有事务,则挂起当前事务
- PROPAGATION_NEVER:非事务方式执行,如果有事务,则抛出异常
分布式事务
分布式事务,是指事务在多个数据源上,要保证多个数据源上得事务,可以使用Atomikos 。参考:SpringBoot Atomikos 多数据源分布式事务