【MySQL是怎么运行的】三、事务
概念
多组sql,要满足四大特性
四大特性
原子性:事务内的多个sql同时成功,同时失败,靠undo日志保证
一致性:事务执行前后,数据从一个合法状态转为另一个合法状态,靠业务保证
隔离性:事务之间相互隔离,靠MVCC和锁保证
持久性:持久化到磁盘,靠redo日志保证
并发问题
create table account
(
id int primary key auto_increment,
name varchar(15),
balance DECIMAL(10, 2)
);
insert into account(name, balance)
values ('张三', 100),
('李四', 0);
- 脏写:写了其他事务未提交的数据,最低的事务隔离级别就解决了
- 脏读:读了其他事务未提交的数据
事务一中张三给李四转账50,未提交事务。事务二读取到的张三余额50是脏数据(可能回滚)
- 不可重复读:同个事务内,多次读取的数据不一致
事务一中张三给李四转账50,提交事务。事务二第一次读取张三余额50。事务一中张三继续给李四转账50,提交事务,事务二第二次读取张三余额是0.
幻读:同个事务内,多次读取的行数不一致
事务一中张三给李四转账50,提交事务。事务二第一次读取余额为50的用户有两个(张三和李四)。事务一中张三继续给李四转账50,提交事务,事务二第二次读取余额为50的用户只有一个(李四100元)
隔离级别
读未提交:解决脏写
读已提交:解决脏读
可重复读:解决不可重复读,MySQL默认隔离级别
串行化:解决幻读,不推荐