事务管理
事务管理
概念
定义:
事务是数据库操作的逻辑单元, 包含一组不可分割的 SQL 操作,
这些操作要么全部成功(提交), 要么全部失败(回滚)
操作
MYSQL 事务控制
begin: 开启事务 commit: 提交事务 rollback: 回滚事务
-- 开启事务 (或 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; -- 任一失败时回滚
@Transactional
概念
容器化执行框架: Spring 事务管理
@Service
public class EmployeeService {
@Transactional // 核心注解
public void addEmployeeWithExperience(Employee emp, List<Experience> expList) {
employeeDao.insert(emp) // 操作1
experienceDao.batchInsert(expList) // 操作2
}
}
位置:业务层(service)的方法上、类上、接口上
- 方法上: 当前方法交给spring进行事务管理
- 类上: 当前类中所有的方法都交由spring进行事务管理
- 接口上: 接口下所有的实现类当中所有的方法都交给spring 进行事务管理
事务日志监控
可以在
application.yml配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的日志信息了
# application.yml
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
异常回滚控制
@Transactional注解 --> 来实现事务管理。
默认情况下,只有出现RuntimeException和Error才回滚异常。
rollbackFor 属性用于控制出现何种异常类型,回滚事务
@Override
@Transactional(rollbackFor = Exception.class)
public void addEmpAndExprList(Emp emp) {
try {
// 业务逻辑 是否回滚
} finally {
// 独立事务管理,确保日志一定输出
EmpLog empLog = new EmpLog();
empLog.setOperateTime(LocalDateTime.now());
empLog.setInfo(emp.toString());
empLogMapper.insert(empLog);
}
事务传播行为
propagation 属性
Q: 什么是事务的传播行为呢?
A: 就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
传播行为
| 传播行为 | 特性 |
|---|---|
| REQUIRED | 加入当前事务, 无事务时新建 (默认) |
| REQUIRES_NEW | 挂起当前事务, 始终新建独立事务 |
| SUPPORTS | 如果外部方法有事务则加入,无事务则无事务 |
应用场景 - 订单日志独立事务
@Override
@Transactional(rollbackFor = Exception.class)
public void addEmpAndExprList(Emp emp) {
try {
// 业务逻辑 是否回滚
} finally {
// 日志管理
EmpLog empLog = new EmpLog();
empLog.setOperateTime(LocalDateTime.now());
empLog.setInfo(emp.toString());
empLogMapper.insert(empLog);
}
@Service
public class EmpLogServiceImpl implements EmpLogService {
@Autowired
private EmpLogMapper empLogMapper;
// REQUIRES_NEW 独立事务管理,确保日志一定输出
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void insertLog(EmpLog empLog) {
empLogMapper.insert(empLog);
}
}
事务特性
| ACID | ||
|---|---|---|
| atomicity | 原子性 | 事务是一个不可分割的单元,里面的操作要么全部成功,要么全部失败 |
| consistency | 一致性 | 事务开始前到事务结束后,数据总量保持不变 |
| isolation | 隔离性 | 事务之间相互隔离,互不影响 |
| durability | 持久性 | 事务一旦提交,数据永久的持久化 |

浙公网安备 33010602011771号