MySql学习笔记-01事务
事务隔离
1、隔离级别的通俗理解
- 读未提交:事务的修改都会被其他事务看见
- 读提交:一个事务提交后,都会被其他事务看见,无论其他事务有没有完成
- 可重复读: 一个事务在执行过程中,只会看到当前事务的变化
- 串行化: 多个事务不会同时进行,一个事务完成了才会进行下一个事务
2、隔离级别-可重复读 是如何实现的
版本快照 MVCC(多版本并发控制)
详细过程
- 每个事务都有一个版本号
- 当前事务的每一行操作都会记录到当前行版本号中,InnoDB每行数据都有多个版本
- 读取每行数据时,不会读取还未提交事务的版本
3、为什么count(*)这么慢
原因:
由于上面所说的 MVCC(多版本并发控制)。对于count(*)语句只能一行行读取进行判断
案例:
赛事预言项目中,积分流水过大,后台分页执行使用count(*)导致慢执行
解决方案:
方案一:对于数据量的记录查询,分页查询尽量不要查询总数。
方案二:新建一张表来保存和维护计数
4、行级锁
什么是行级锁?
在一个事务中,对于修改的行会进行上锁,直到事务结束才会释放锁
为什么需要行级锁?
提高业务的并发度
死锁了怎么办?
方案一:保证业务不存在死锁
方案二:设置超时时间,超时释放,事务执行失败
方案三:死锁检测,回滚死锁中的一个事务