(重点) MySQL(入门篇16)事务,事务案例。

一、事务

事务有ACDI原则

1.原子性(Atomicy)

要么都成功,要么都失败

2. 一致性(Consistency)

事务前后的数据保持一致

3.持久性(Durability) – 事务提交

事务一旦提交不可逆

4.隔离性 (Isolation)

多个人,同时给张三转钱的时候,每一笔转账开启一个事务,多个事务相互隔离就是隔离性

二、隔离性产生的数据问题

多个用户都在操作数据产生的数据问题。

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

1.比如张三和李四同时区银行取相同账号的钱,此时账户上有1000,李四,取钱1000,数据还没有提交成功
2.张三以迅雷不及掩耳之势迅速取钱 1000,此时因为账户的数据还没有来得及修改,于是,张三查询余额的时候还是1000.

2.不可重复读:多次数据读取的结果不同 (这个不一定是错误)

1.你查看 QQ 的信息,第一次刷新,没有人给你发信息,第二次刷新,出现了一条信息,2次查询的结果不一致,因为第一次刷新的对方还没有提交成功,就是不可重复读

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

和不可重复读类似,第一次查询余额的时候,是1000 元,然后别人充值了1000 元,你第二次查询的时候就是 2000 元了,

三、事务的案例模拟

1.建表

1.数据库 事务银行 tansactionBank

CREATE DATABASE IF NOT EXISTS `transactionBank`CHARACTER SET utf8 COLLATE utf8_general_ci;

2.表 事务银行 tansactionBank01

CREATE TABLE IF NOT EXISTS `tansactionBank01`(
`id` INT NOT NULL AUTO_INCREMENT COMMENT "账号",
`name` VARCHAR(30) NOT NULL COMMENT "名称",
`money` DECIMAL(9,2) NOT NULL DEFAULT 0 COMMENT "账户余额00.00格式默认为0",
 PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET=utf8

3.插入数据:

INSERT INTO `tansactionbank01`
(`name`,`money`)
VALUES
("张三",0),
("李四",1000);

最终效果:
在这里插入图片描述

2. 了解事务的基本操作

操作 作用 解释
set autocommit = 0; 关闭自动提交,mysql默认启动自动提交 使用手动事务之前关闭自动提交事务
set autocommit = 1; 启动功自动提交 使用手动提交事务之后开启自动提交事务
start transaction; 开启一个(组)事务
commit; 提交事务 持久性,提交之后不能回滚了
rollback; 回滚事务 回到最初的起点(有存档的办法可回到存档点但是不常用了解即可.)

3. 事务实例:使用事务李四给张三转账 500元

-- 1. 关闭自动提交,方便手动提交
SET autocommit = 0;
-- 2.开启一个(组)新的事务
START TRANSACTION;
-- 3.进行事务转账操作
UPDATE `tansactionbank01` SET 
`money` = `money`- 500
WHERE `name` = "李四";

UPDATE `tansactionbank01` SET 
`money` = `money`+ 500
WHERE `name` = "张三";
-- 4. 回滚
ROLLBACK;
-- 4.2 提交
COMMIT;
-- 4.3 提交后再回滚 (数据已经更改持久性,不能回滚成功)
COMMIT;
ROLLBACK;
-- 5.把自动提交恢复为默认.
SET autocommit = 1;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章