1. 事务介绍
将一组操作封装成一个执行单元,要么全部成功,要么全部失败。当执行某个操作,例如转账操作时(分为先将钱从个人账户扣除和将他人账户新增两个操作),如果这两个操作不能同时成功或者失败,那么就会出现财产问题。事务就可以很好的解决这个问题。
事务的概念起源于数据库,Spring中事务也是通过数据库事务实现。事务具备四大特性,原子性,一致性,隔离性,持久性,自身的单元之间具备不可分割的特性。事务的具体内容会在数据库事务文章中进行介绍。
2. Spring 事务如何使用
Spring 中的事务操作分为两类:
- 手动操作事务
- 声明式自动提交事务
2.1 手动操作事务
Spring 手动操作事务分为三个步骤:
- 开启事务(获取事务)
- 提交事务
- 回滚事务
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
标签:回滚,管理器,Spring,事务,teacher,异常,梳理 From: https://www.cnblogs.com/hungryquiter/p/17178099.html