一、事务
事务有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;