Mysql中事务隔离级别的解决方案

事务隔离级别的实现

解决方案

关于事务的隔离级别的实现方案有两种:

  1. LBCC(Lock Base Concurrency Control) : 在读取数据前对其加锁,阻止其他事务对数据进行修改。
  2. MVCC(Muti Version Concurrency Control): 生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或者事务级)的一致性读取。

LBCC(基于锁的解决方案)

Innodb中的行锁是通过锁定索引项来实现的。

锁的基本类型

锁:用于管理不同事务对共享资源的并发访问的一种解决方案。
从锁的粒度分为:表锁和行锁。关于表锁和行锁的比较包括:

  1. 锁定粒度 表>行
  2. 加锁效率 表>行
  3. 冲突概率 表<行
  4. 并发性能 表<行

其中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默认的行锁算法。临键锁=间隙所+记录锁。用于解决幻读的问题。解决幻读的隔离级别。

猜你喜欢

转载自blog.csdn.net/weixin_44755131/article/details/89399687