MySQL笔记6:事务简介,事务模拟

6. 事务

6.1 什么是事务

要么都成功,要么都失败

——————————————————————————

  1. SQL执行 A给B转账 A 1000 --> 200 --> B 200
  2. SQL执行 B收到A给的钱 A 800 --> B400

——————————————————————————

将一组SQL放在同一个批次中执行。

事务管理原则:ACID

ACID:原子性,一致性,隔离性,持久性

  • 原子性(Atomicity):要么都完成,要么都不完成
  • 一致性(Consistency):最终一致性,事务完成后符合逻辑运算,事务前后的数据完整性保证一致
  • 持久性(Durability):事务结束后的数据不随着外界原因导致数据丢失(如果没提交就恢复原状,提交了就持久化到数据库)事务一旦提交就不可逆
  • 隔离性(Isolation):多个用户同时操作时不会互相影响

隔离导致的问题

  • 脏读:一个事务读取了另外一个事务未提交的数据
  • 不可重复读:多次读取数据时读取结果不同(不一定错误,只是场合不对)
  • 幻读(虚读):在读取时读到了别的事务插入的数据,导致前后读取不一致

6.2 事务模拟

流程:MySQL默认自动提交

  1. 关闭自动提交
  2. 事务开启
  3. 执行命令
    • 成功:提交,持久化
    • 失败:回滚至初始状态
  4. 开启自动提交
-- 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; -- 恢复自动提交
posted @ 2022-05-18 17:38  chachan53  阅读(204)  评论(0编辑  收藏  举报