spring 中实现事务的几种方式

一、声明式事务

通过Service 层方法上添加 Spring 的 @Transactional 注解来完成

常用配置

参 数 名 称 功 能 描 述
readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})

noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时



 

参考

实现事务三种方式(AOP + xml、AOP + @Aspect、@Transactional)

二、编程式事务

1、使用TransactionTemplate配置

@Resource
private TransactionTemplate transactionTemplate;

public void test(){
       Object result = transactionTemplate.execute(e->{
              // 对应代码 

              return result;
       });
}
注:

1、TransactionTemplate的三个主要方法

        1> afterPropertiesSet  

        2> execute 任务执行(报错直接调rollbackOnException )

        3> rollbackOnException 回滚方法

2、TransactionTemplate的成员变量:

        transactionManager,对应PlatformTransactionManager事务控制器
        ——execute和rollbackOnException方法里的具体事务控制都是调用里PlatformTransactionManager里的接口方法

3、execute(...)执行事务管理的时候调用 参数TransactionCallback中dolnTransaction方法,通过匿名内部类的方式在doInTransaction里重写需要进行事务控制的业务代码即可

4、TransactionTemplate .execute(...)执行事务管理的时候,传入的参数有两种选择:

      1.TransactionCallback

       2.TransactionCallbackWithoutResult

       前者有返回值,后者无返回值

参考:

TransactionTemplate编程式事务-CSDN博客

2、使用PlatformTransactionManager

    @Resource()
    PlatformTransactionManager transactionManager;
    
    public int insert(Product product,ProdutExt ext){
   
        TransactionStatus ts = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
   
            //TODO 数据库操作
            transactionManager.commit(ts);
        }catch(Exception e){
   
            //异常时回滚
            transactionManager.rollback(ts);
            throw e;
        }
    }
注:

1、PlatformTransactionManager用于整个事务的创建、开启、提交、回滚操作;事务的定义由TransactionDefinition定义事务的隔离级别;TransactionStatus用于对新创建的事务进行管理。

2、PlatformTransactionManager的三个方法

       

public interface PlatformTransactionManager extends TransactionManager {
   
    
    //1.创建一个事务并开启事务
	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;

   //2.提交事务
	void commit(TransactionStatus status) throws TransactionException;

   //3.回滚事务
	void rollback(TransactionStatus status) throws TransactionException;

}

3、PlatformTransactionManager中一些对象

  • TransactionDefinition : 事务的一些基础信息,如超时时间、隔离级别、传播属性等
  • TransactionStatus : 事务的一些状态信息,如是否是一个新的事务、是否已被标记为回滚

你可能感兴趣的:(spring,spring,java,数据库)