MySQL Day06 事务

MySQL 事务

1 什么是事务

要么都成功,要么都失败!

举例说明:
初始状态:A为1000¥ B为200¥

——————

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

——————

将以上一组SQL放在一个批次中执行则成为一个事务!

事务原则: ACID原则:原子性、一致性、隔离性、持久性

原子性(Atomicity): 要么都成功、要么都失败

一致性(Consistency): 针对一个事务操作前语操作后状态一直。比如总价值一定是1200,不可能增加或减少。

持久性(Durability): 事务结束后的数据不会随着外界原因导致数据丢失。例如:服务器宕机或者断电。数据值仅与事务提交状态相关联!事务一旦提交不可逆。

隔离性(Isolation): 针对对个用户同时操作,主要是排除其他事务对本次事务的影响。

隔离所导致的一些问题:

脏读: 指一个事务读取了另外一个事务未提交的数据。

不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定错误,只是某些场合不对)

虚度(幻读): 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

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 保存点名 -- 撤销保存点

流程图展示:

在这里插入图片描述

3 转账案例

首先需要创建一个商店的数据库:

-- 商店数据库
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
USE shop;

创建数据表并插入A、B两个账户:

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.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; -- 恢复默认值

写在最后

Forgetting what is behind and straining toward what is ahead.(Philippians 3:13)

To Demut and Dottie!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章