事务

MySQL 数据库学习笔记(续)

六、事务

6.1 什么是事务?

核心定义
要么全部执行成功,要么全部执行失败

----------------------------------------------
1、SQL执行 A 给 B 转账  
A 1000  B 200 
A - 200 - >  B 200
A 800   B 400
----------------------------------------------

核心:将一组 SQL 放在一个批次中统一执行


事务四大原则:ACID 原则

  • 原子性(Atomicity)
    要么全部成功,要么全部失败

  • 一致性(Consistency)
    事务执行前后,数据库数据完整性保持一致

  • 持久性(Durability)
    事务一旦提交,操作不可逆,数据永久保存到数据库

  • 隔离性(Isolation)
    多个事务并发执行时,相互隔离、互不干扰,不会互相篡改数据


隔离性引发的问题

  1. 脏读
    一个事务读取了另一个事务未提交的数据

  2. 不可重复读
    在同一个事务内,多次读取同一行数据,结果不一致

  3. 虚读(幻读)
    同一个事务内,读取到其他事务新增插入的数据,导致前后查询结果不一致


6.2 执行事务

-- mysql 默认开启事务自动提交
SET AUTOCOMMIT = 0 /* 关闭自动提交 */
SET AUTOCOMMIT = 1 /* 开启自动提交(默认) */

手动处理事务步骤

-- 1. 关闭自动提交
SET AUTOCOMMIT = 0 

-- 2. 开启事务
START TRANSACTION  
-- 标记事务开始,后续所有 SQL 都在同一个事务内

-- 执行多条业务SQL
INSERT xxx
INSERT xxx

-- 3. 执行成功 → 提交事务,数据持久化
COMMIT

-- 3. 执行失败 → 事务回滚,数据恢复原样
ROLLBACK

-- 4. 事务结束,恢复自动提交
SET AUTOCOMMIT = 1 

拓展:事务保存点

SAVEPOINT 保存点名                -- 设置事务保存点
ROLLBACK TO SAVEPOINT 保存点名    -- 回滚至指定保存点
RELEASE SAVEPOINT 保存点名        -- 删除指定保存点

6.3 事务模拟场景(转账案例)

-- 创建数据库
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop

-- 创建账户表
CREATE TABLE `account`(
`id`    int (3) NOT NULL AUTO_INCREMENT,
`name`  VARCHAR (30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

-- 初始化测试数据
INSERT INTO account (`name`,`money`)
VALUES('A','2000'),('B','2000')

-- 模拟转账完整事务
SET AUTOCOMMIT = 0 -- 关闭自动提交

START TRANSACTION  -- 开启事务

UPDATE account SET money = money-500 WHERE `name` = 'A' -- A 扣款 500
UPDATE account SET money = money+500 WHERE `name` = 'B' -- B 收款 500

COMMIT;    -- 正常提交,数据永久生效

ROLLBACK;  -- 出现异常则回滚,数据恢复

SET AUTOCOMMIT = 1; -- 恢复数据库默认自动提交

事务小结

  1. 事务仅针对 InnoDB 引擎,MyISAM 不支持事务
  2. 日常 MySQL 默认自动提交事务,业务操作需手动关闭
  3. 转账、订单、扣款等核心业务,必须使用事务保证数据安全
  4. COMMIT 提交固化数据,ROLLBACK 回滚撤销所有操作
posted @ 2026-04-14 15:14  果子同志  阅读(4)  评论(0)    收藏  举报