Springboot的事务详解

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)表示设置当前事务的隔离级别

  1. Isolation.DEFAULT默认的事务隔离级别,也就是一般数据库的默认隔离级别Isolation.READ_COMMITTED
  2. Isolation.READ_UNCOMMITTED该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据,该级别不能防止脏读,不可重复读和幻读
  3. Isolation.REPEATABLE_READ该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。
  4. Isolation.SERIALIZABLE该隔离级别表示所有的事务依次逐个执行,事务之间完全独立执行,该级别可以防止脏读、不可重复读以及幻读。这种执行方式会降低效率,不建议使用,一般情况下也不会使用该级别。

@Transactional(rollbackFor = {Exception.class})设置需要回滚的异常,可以是异常数组

@Transactional(rollbackForClassName= {“Exception”})设置需要回滚的异常,可以是异常数组

@Transactional(propagation = Propagation.REQUIRED)表示当前事务的传播行为

  1. Propagation.REQUIRED表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
  2. Propagation.REQUIRES_NEW表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  3. Propagation.SUPPORTS表示如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  4. Propagation.NOT_SUPPORTED表示以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  5. Propagation.NEVER表示以非事务方式运行,如果当前存在事务,则抛出异常。
  6. Propagation.MANDATORY表示如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  7. Propagation.NESTED表示如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于Propagation.REQUIRED

@Transactional(timeout = 1)表示当前事务可执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值