Mysql 专题:Mysql中的锁你了解多少?
Mysql 专题:Mysql中的锁你了解多少?
在你的开发生涯中,最先接触到锁的概念大概就是在synchronized这个关键字了,偏向锁、轻量级锁、重量级锁。锁的出现是为了解决并发安全问题,其实在Mysql中也是一样,Mysql中各种锁的出现是为了解决并发中数据安全问题及提升并发访问的效率。那么Innodb引擎的行级锁到底是怎么实现的呢?幻读问题怎么解决的呢?今天的东西有点多,准备好小板凳。但是收获肯定也不会少。
目录
1: 锁的定义
** lock
** latch
2: Innodb中锁的类型
** 共享锁(S Lock)
** 排他锁(X Lock)
** 意向共享锁(IS Lock)
** 意向排他锁(IX Lock)
3: 一致性锁定读/一致性非锁定读
** 一致性锁定读
** 一致性非锁定读
4: 行锁的三种算法
** Record Lock
** Gap Lock
** Next-Key Lock
一:锁的定义
锁是数据库区分于文件系统的的一个关键特性。锁用于管理对并发资源的并发访问,Innodb实现了在行级别上对数据进行锁定。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。MyISAM只实现了表级别的锁。相比Innodb并发写的性能肯定是要更逊色一些的。
Lock
Lock的对象是事务,用来锁定数据库中的对象,如行,页,表。并且锁定的对象一般在commit或者rollback后进行释放,lock是有死锁机制的。
latch
latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。如果持续的时间特别长,性能会特别差,在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁),latch 是没死锁机制的。
二:锁的类型
共享锁(S Lock)
允许事务读一行数据
排他锁(X Lock)
允许事务更新或者删除一行数据
如果一个事务T1已经获得了行r的共享锁,那么事务T2也能获得行r的共享锁,这种情况叫锁兼容,但如果有其他事务T3想获得行r的排他锁,那么必须等待T1和T2释放r的共享锁之后才能获得行r的排他锁。如下图排他锁和共享锁的兼容性
意向共享锁(IS Lock)
事务想要获得一张表中某几行的共享锁
意向排他锁(IX Lock)
事务想要获得一张表中某几行的共享锁
现在你知道表中锁多行数据是怎么实现的吧。意向锁不会阻塞除全表扫描之外的任何请求,表级意向锁和行级锁的兼容性如下图
三:一致性锁定读/一致性非锁定读
一致性非锁定读
一致性的非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE或UPDATE操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB存储引擎会去读取行的一个快照数据。
快照数据是指该行的之前版本的数据,该实现是通过undo段来完成。而undo用来在事务中回滚数据,因此快照数据本身是没有额外的开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。
MVCC
快照数据其实就是当前行数据之前的历史版本,每行记录可能有多个版本。一个行记录可能有不止一个快照数据,一般称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制(Multi Version Concurrency Control,MVCC)。
RC和RR的一致性非锁定读
在事务隔离级别READ COMMITTED和REPEATABLE READ(InnoDB存储引擎的默认事务隔离级别)下,InnoDB存储引擎使用非锁定的一致性读。然而,对于快照数据的定义却不相同。在READ COMMITTED事务隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。
一致性锁定读
在RC和RR情况下,InnoDB存储引擎的SELECT操作使用一致性非锁定读。但是在某些情况下,用户需要显式地对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支持加锁语句,即使是对于SELECT的只读操作。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作:
❑SELECT…FOR UPDATE
❑SELECT…LOCK IN SHARE MODE
四:行锁的三种算法
Record Lock:单个行记录上的锁
Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
Next-Key Lock∶ Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身
END
今天的内容就讲到这里啦,下期会继续给大家带来行锁的具体作用及一些例子,还有幻读在RR这个隔离级别是怎么实现的。