MySQL笔记6:事务简介,事务模拟
6. 事务
6.1 什么是事务
要么都成功,要么都失败
——————————————————————————
- SQL执行 A给B转账 A 1000 --> 200 --> B 200
- SQL执行 B收到A给的钱 A 800 --> B400
——————————————————————————
将一组SQL放在同一个批次中执行。
事务管理原则:ACID
ACID:原子性,一致性,隔离性,持久性
- 原子性(Atomicity):要么都完成,要么都不完成
- 一致性(Consistency):最终一致性,事务完成后符合逻辑运算,事务前后的数据完整性保证一致
- 持久性(Durability):事务结束后的数据不随着外界原因导致数据丢失(如果没提交就恢复原状,提交了就持久化到数据库)事务一旦提交就不可逆
- 隔离性(Isolation):多个用户同时操作时不会互相影响
隔离导致的问题
- 脏读:一个事务读取了另外一个事务未提交的数据
- 不可重复读:多次读取数据时读取结果不同(不一定错误,只是场合不对)
- 幻读(虚读):在读取时读到了别的事务插入的数据,导致前后读取不一致
6.2 事务模拟
流程:MySQL默认自动提交
- 关闭自动提交
- 事务开启
- 执行命令
- 成功:提交,持久化
- 失败:回滚至初始状态
- 开启自动提交
-- mysql 是默认开启事务自动提交的
SET autocommit = 0 -- 关闭自动提交
SET autocommit = 1 -- 开启自动提交(默认)
-- 手动处理事务
SET autocommit = 0
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后sql都在同一个十五内
-- 提交:持久化,成功提交,失败回滚
COMMIT
-- 回滚:回到原来的样子
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点
RELEASE SAVEPOINT 保存点 -- 撤销指定保存点
模拟转账事务
-- 创建数据库
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 使用shop数据库
USE `shop`;
-- 建表
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 初始化数据
INSERT INTO account(`name`,`money`)
VALUES('A',2000.00),('B',10000.00);
-- 模拟转账
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; -- 恢复自动提交