为什么要用事务管理
在我们同时操作两个或更多个数据库时,可能因为网络等各方面原因导致中间出现异常。造成像对第一个数据库的操作成功了,但是对第二个数据库的操作没有成功。这样数据的完整性就被破坏了。
事务:是一组操作的集合,要么同时成功,要么同时失败
事务控制主要三步操作:开启事务、提交事务/回滚事务。
-- 开启事务
start transaction; / begin;-- 1. 保存员工基本信息
insert into emp values (39, 'Tom', '123456', '汤姆', 1, '13300001111', 1, 4000, '1.jpg', '2023-11-01', 1, now(), now());-- 2. 保存员工的工作经历信息
insert into emp_expr(emp_id, begin, end, company, job) values (39,'2019-01-01', '2020-01-01', '百度', '开发'), (39,'2020-01-10', '2022-02-01', '阿里', '架构');-- 提交事务(全部成功)
commit;-- 回滚事务(有一个失败)
rollback;
Spring事务管理-(员工管理)
Transactional注解
注解:@Transactional
作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。
位置:业务层的方法上、类上、接口上
方法上:当前方法交给spring进行事务管理(推荐)
类上:当前类中所有的方法都交由spring进行事务管理
接口上:接口下所有的实现类当中所有的方法都交给spring 进行事务管理
可以在application.yml
配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的日志信息了
#spring事务管理日志
logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug
事务进阶
这里主要介绍@Transactional注解当中的两个常见的属性:
异常回滚的属性:
rollbackFor
事务传播行为:
propagation
我们先来学习下rollbackFor属性。
:默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。如果想要所有的异常都回滚,需要配置robackFor属性
@Transactional(rollbackFor = Exception.class)
2.Propagation注解
就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
属性值 | 含义 |
REQUIRED | 【默认值】需要事务,有则加入,无则创建新事务 |
REQUIRES_NEW | 需要新事务,无论有无,总是创建新事务 |
SUPPORTS | 支持事务,有则加入,无则在无事务状态中运行 |
NOT_SUPPORTED | 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务 |
MANDATORY | 必须有事务,否则抛异常 |
NEVER | 必须没事务,否则抛异常 |
… |
对于这些事务传播行为,我们只需要关注以下两个就可以了:
REQUIRED(默认值)
REQUIRES_NEW