Springboot事务
在springboot里面,有两种是方式,一种是编程式事务,一种是声名式事务
编程式事务:
- 使用
TransactionTemplate
,这个使用很简单,就是一个模板类
public void insetTest(){
transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction(TransactionStatus transactionStatus) {
try {
//do something
}
catch (Exception e){
transactionStatus.isRollbackOnly();//回滚
e.printStackTrace();
}
return null;
}
});
}
doInTransaction
是做逻辑处理的
注意,捕获了需要手动回滚,毕竟异常被你捕获了,spring不知道发生异常了
- 使用
TransactionManager
public void insetTest(){
TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionAttribute());
try {
//do something
transactionManager.commit(transactionStatus);//提交
} catch (Exception e) {
transactionManager.rollback(transactionStatus);//回滚
e.printStackTrace();
}
}
spring推荐使用TransactionTemplate
实现编程式事务
声名式事务:
声名式事务是通过AOP实现的,对方法进行拦截,在方法执行前创建或者加入到事务中,在方法执行完后提交或者回滚。spring主要是对unchecked Exception进行回滚,也就是runtimeException及其子类进行回滚,而不会对checked Exception进行回滚,如果需要回滚,可以通过rollbackfor进行设置,也可以捕获异常时进行手动回滚
@Transactional
public class TransactionService {
public void insetTest(){
//回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//设置回滚点
Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
//回滚到设置的回滚点
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
}
}
注解配置:
@Transactional(isolation = Isolation.DEFAULT,readOnly = true,rollbackFor = {Exception.class},timeout = 1,rollbackForClassName = {"Exception"},propagation = Propagation.REQUIRED)
@Transactional(readOnly=true)表示设置当前事务为只读事务,false表示可读写
@Transactional(isolation = Isolation.DEFAULT)表示设置当前事务的隔离级别
- Isolation.DEFAULT默认的事务隔离级别,也就是一般数据库的默认隔离级别Isolation.READ_COMMITTED
- Isolation.READ_UNCOMMITTED该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据,该级别不能防止脏读,不可重复读和幻读
- Isolation.REPEATABLE_READ该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
- Isolation.SERIALIZABLE该隔离级别表示所有的事务依次逐个执行,事务之间完全独立执行,该级别可以防止脏读、不可重复读以及幻读。这种执行方式会降低效率,不建议使用,一般情况下也不会使用该级别。
@Transactional(rollbackFor = {Exception.class})设置需要回滚的异常,可以是异常数组
@Transactional(rollbackForClassName= {“Exception”})设置需要回滚的异常,可以是异常数组
@Transactional(propagation = Propagation.REQUIRED)表示当前事务的传播行为
- Propagation.REQUIRED表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
- Propagation.REQUIRES_NEW表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- Propagation.SUPPORTS表示如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- Propagation.NOT_SUPPORTED表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- Propagation.NEVER表示以非事务方式运行,如果当前存在事务,则抛出异常。
- Propagation.MANDATORY表示如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- Propagation.NESTED表示如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于Propagation.REQUIRED
@Transactional(timeout = 1)表示当前事务可执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务