Spring 事务管理与传播机制详解
一、事务基础
什么是事务
事务本质上是一组不可分割的操作集合。它将多个操作视为一个整体,要么全部向数据库提交,要么全部撤销。这意味着这组操作具有原子性:要么同时成功,要么同时失败。
为什么需要事务
在业务开发中,数据一致性至关重要。例如转账场景:A 账户扣款与 B 账户入账必须同时完成。若第一步成功而第二步失败,资金就会凭空消失。引入事务后,这一系列操作被绑定在一起,确保了数据的完整性。 再如秒杀系统,下单成功与库存扣减也需处于同一事务中。若下单成功但库存扣减失败,会导致超卖问题。因此,将关键步骤纳入事务管理是保障业务逻辑正确的必要手段。
事务的操作
核心流程包含三个步骤:
- 开启事务:在执行一组操作前启动(如
START TRANSACTION或BEGIN)。 - 提交事务:当所有操作均成功后确认更改(
COMMIT)。 - 回滚事务:若中间任何一步出现异常,则撤销所有更改(
ROLLBACK)。
-- 开启事务
START TRANSACTION;
-- 执行 SQL 操作...
-- 提交事务
COMMIT;
-- 或者回滚事务
ROLLBACK;
二、Spring 中事务的实现
Spring 提供了两种事务管理模式:编程式事务和声明式事务。
在深入之前,我们先构建一个基础场景:用户注册时,需在用户表插入信息,同时在日志表记录操作痕迹。
数据准备
-- 创建数据库
DROP DATABASE IF EXISTS trans_test;
CREATE DATABASE trans_test DEFAULT CHARACTER SET utf8mb4;
-- 用户表
DROP TABLE IF EXISTS user_info;
CREATE TABLE user_info (
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR(128) NOT NULL,
`password` VARCHAR(128) NOT NULL,
`create_time` DATETIME DEFAULT NOW(),
`update_time` DATETIME NOW() NOW(),
(`id`)
) ENGINE INNODB utf8mb4 COMMENT ;
IF log_info;
log_info (
`id` AUTO_INCREMENT,
`user_name` () ,
`op` () ,
`create_time` DATETIME NOW(),
`update_time` DATETIME NOW() NOW()
) CHARSET ;


