Spring 事务梳理

1. 事务介绍

将一组操作封装成一个执行单元,要么全部成功,要么全部失败。当执行某个操作,例如转账操作时(分为先将钱从个人账户扣除和将他人账户新增两个操作),如果这两个操作不能同时成功或者失败,那么就会出现财产问题。事务就可以很好的解决这个问题。

事务的概念起源于数据库,Spring中事务也是通过数据库事务实现。事务具备四大特性,原子性,一致性,隔离性,持久性,自身的单元之间具备不可分割的特性。事务的具体内容会在数据库事务文章中进行介绍。

2. Spring 事务如何使用

Spring 中的事务操作分为两类:

  • 手动操作事务
  • 声明式自动提交事务

2.1 手动操作事务

Spring 手动操作事务分为三个步骤:

  1. 开启事务(获取事务)
  2. 提交事务
  3. 回滚事务

SpringBoot 内置了两个对象,可以用来处理事务:

JDBC 事务管理器 DataSourceTransactionManager 用来获取事务、提交事务和回滚事务。

TransactionDefinition 是事务的属性,在获取事务的时候需要将 TransactionDefinition 传递进去从而获得一个事务 TransactionStatus。

public void methodTest(){
        // 开启事务
        DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
        // 事务传播行为
        defaultTransactionDefinition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        // 设置
        TransactionStatus status = transactionManager.getTransaction(defaultTransactionDefinition);
        try {
            // TODO 处理我们的业务逻辑代码......
            Teacher teacher = new Teacher();
            teacher.setTName("test");
            teacher.setTId(22);
            teacherMapper.insert(teacher);
//            int i = 1/0;
            // 没有异常便手动提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 有异常便回滚事务
            transactionManager.rollback(status);
        }
    }

 2.2 Spring 声明式事务

声明式事务的实现相较于手动实现要简单很多,只需要在需要添加事务的方法上加上 @Transactional 注解就可以,无需手动开启事务和提交事务,进入方法时会自动开启事务,方法执行完成会自动提交事务,如果中途发生了没有处理的异常就会自动回滚事务。

@Transactional(propagation = Propagation.REQUIRED)
public void methodB( int tIdm, String name) {
    Teacher teacher = new Teacher();
    teacher.setTName(name);
    teacher.setTId(tIdm);
    teacherMapper.insert(teacher);
}

3. @Transactional 注解介绍

3.1 @Transactional 作用范围

@Fransactional 可以用来修饰方法或类:

  • 修饰方法时:表示当前的方法开启事务,需要注意只能应用在 public 方法上。
  • 修饰类时:表示当前该类下面的所有被 public 修饰的方法都开启事务。

3.2 @Transactional 参数说明

参数

作用

value

当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。

transactionManager

当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。

propagation

事务的传播行为,默认值为 Propagation.REQUIRED。

isolation

事务的隔离级别,默认值为 Isolation.DEFAULT。

timeout

事务的超时时间,默认值为-1(表示没有超时时间)。如果超过该超时时间显示但事务还没有完成,则自动回滚事务

readOnly

指定事务是否为只读事务,默认值为 false。为了忽略那些不需要事务的方法,比如读取数据,可以设置为 true。

rollbackFor

用于指定能够被触发事务回滚的异常类型,可以指定多个异常类型。

rollbackForClassName

用于指定能够被触发事务回滚的异常类型,可以指定多个异常类型。

noRollbackFor

抛出异常的类型,不回滚事务,也可以指定多个异常类型。

noRollbackForClassName

抛出异常的类型,不回滚事务,也可以指定多个异常类型。

 

参考:

https://blog.csdn.net/weixin_51367845/article/details/126216621

https://baijiahao.baidu.com/s?id=1699740038345003849&wfr=spider&for=pc

https://blog.csdn.net/zxl646801924/article/details/120786005

 

posted @ 2023-03-04 12:39  小log  阅读(28)  评论(0编辑  收藏  举报