一、什么是事务
要么都成功,要么都失败
例子:转账
- 1、sql执行 A给B转账 A 1000 —> 200 B 200
- 2、sql执行 B收到A的钱 A 800 —>B 400
将一组sql放在一个批次中去执行,作为一个整体,要么都成功,要么都失败!
二、ACID
事务原则: ACID原则,原子性、一致性、隔离性、持久性 (脏读、幻读……)
- 原子性是指事务的原子性操作,对数据的修改要么全部执行成功,要么全部失败,实现事务的原子性,是基于日志的Redo/Undo机制。
- 一致性是指执行事务前后的状态要一致,可以理解为数据一致性。隔离性侧重指事务之间相互隔离,不受影响,这个与事务设置的隔离级别有密切的关系。
- 持久性则是指在一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到书库中。
- 在我的理解中,原子性、隔离性、持久性都是为了保障一致性而存在的,一致性也是最终的目的。
脏读:
指一个事务读取到了另外一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同(这不一定是错误的,要看场合)
幻读
指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致
三、执行事务
-- ================ mysql默认开启事务 =======================
set autocommit = 0 ; -- 关闭事务
set autocommit = 1 ; -- 开启事务
-- 手动处理事务流程
set autocommit = 0;
start transaction --标记一个事务的开始,从这个之后的sql都在同一个事务内
-- insert … 执行的sql
-- select ……
-- update ……
-- delete ……
commit; -- 提交:持久化 (成功)
rollback; -- 回滚 : 回到原来的样子(失败)
-- 事务结束
set cutommit = 1; -- 开启自动提交
-- 了解
SAVEPOINT 保存点 -- 设置一个保持点
ROLLBACK to SAVEPOINT 保存点 -- 回滚到保存点
-- 相当于小时候玩游戏的存档
RELEASE SAVEPOINT 保存点 -- 删除一个保存点
转账模拟
-- 转账
create database shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
create table account(
id int(5) NOT NULL auto_increment,
`name` varchar(20) NOT NULL,
money DECIMAL(9,2) NOT NULL,
primary key(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8
insert into account VALUES(1,'A',2000.0),(2,'B',20000.0)
-- 模拟转账
set autocommit = 0; -- 关闭事务自动提交
START TRANSACTION; -- 开启事务
UPDATE account set money = money - 500 where `name` = 'A';
UPDATE account set money = money + 500 where `name` = 'B';
commit; -- 提交事务
ROLLBACK; -- 回滚
set autocommit = 1; -- 开启事务自动提交
SELECT *
from account;