事务
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)
多个事务并发执行时,相互隔离、互不干扰,不会互相篡改数据
隔离性引发的问题
-
脏读
一个事务读取了另一个事务未提交的数据 -
不可重复读
在同一个事务内,多次读取同一行数据,结果不一致 -
虚读(幻读)
同一个事务内,读取到其他事务新增插入的数据,导致前后查询结果不一致
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; -- 恢复数据库默认自动提交
事务小结
- 事务仅针对 InnoDB 引擎,MyISAM 不支持事务
- 日常 MySQL 默认自动提交事务,业务操作需手动关闭
- 转账、订单、扣款等核心业务,必须使用事务保证数据安全
COMMIT提交固化数据,ROLLBACK回滚撤销所有操作

浙公网安备 33010602011771号