事务隔离级别的解决方案在mysql中如何实现的?
- 事务隔离级别的实现
- 解决方案
- LBCC(基于锁的解决方案)
- 锁的基本类型
- 共享锁
- 排他锁
- 意向锁
- 意向共享锁(Intention Shared Lock, 简称IS锁)
- 意向排他锁(Intention ExclusiveLock, 简称IX锁)
- 记录锁
- 间隙锁
- 临键锁
事务隔离级别的实现
解决方案
关于事务的隔离级别的实现方案有两种:
- LBCC(Lock Base Concurrency Control) : 在读取数据前对其加锁,阻止其他事务对数据进行修改。
- MVCC(Muti Version Concurrency Control): 生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或者事务级)的一致性读取。
LBCC(基于锁的解决方案)
Innodb中的行锁是通过锁定索引项来实现的。
锁的基本类型
锁:用于管理不同事务对共享资源的并发访问的一种解决方案。
从锁的粒度分为:表锁和行锁。关于表锁和行锁的比较包括:
- 锁定粒度 表>行
- 加锁效率 表>行
- 冲突概率 表<行
- 并发性能 表<行
其中MyISAM只支持表锁,Innodb支持表锁和行锁。
从锁的基本模式分为:共享锁、排他锁、意向锁。
其中共享锁和排他锁是行锁,意向锁是表锁。
从锁的算法分为:记录锁、临建锁、间隙锁。
共享锁
又称为读锁,简称S锁,就是多个事务对于同一个数据可以共享一把锁,都能访问到数据,但是只能读不能修改。加锁方式:
select * from student where id = 1 LOCK IN SHARE MODE;
释放锁的方式(对事务进行提交或者回滚):
commit/rollback;
排他锁
又称为写锁,简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,则其他事务不能再获取该行的锁(共享锁、排他锁),只能该获取了排他锁的事务对数据进行读取和修改。
加锁方式:
自动:delete/update/insert 默认加上X锁;
手动:
select * from student where id =1 for update;
释放锁的方式:
commit/rollback;
意向锁
意向锁是由数据引擎自己维护的,用户无法手动操作意向锁。
意向共享锁(Intention Shared Lock, 简称IS锁)
表示事务准备给数据行加共享锁之前必须先取得该表的IS锁。
意向排他锁(Intention ExclusiveLock, 简称IX锁)
表示事务准备给数据行加共享锁之前必须先取得该表的IX锁。
记录锁
唯一性索引等值查询,精准命中一条记录的时候就是记录锁,然后锁住改行数据。解决脏读、不可重复读问题
间隙锁
范围查询没有命中任何一条记录的时候,获取的就是间隙锁,同一个间隙锁之间是互相不冲突的。
临键锁
范围查询的时候,Innodb默认的行锁算法。临键锁=间隙所+记录锁。用于解决幻读的问题。解决幻读的隔离级别。