事务管理

事务管理

概念

定义:
事务是数据库操作的逻辑单元, 包含一组不可分割的 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注解 --> 来实现事务管理。
默认情况下,只有出现 RuntimeExceptionError 才回滚异常。

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 持久性 事务一旦提交,数据永久的持久化
posted @ 2025-07-14 08:38  Breezy_space  阅读(10)  评论(0)    收藏  举报