mysql之InnoDB引擎下各种锁机制笔记

一.什么是锁

锁是数据库区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。

二.lock 与 latch

1.latch一般称为闩(shuan)锁(轻量级的锁),在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是保证并发线程操作临界资源的正确性,并且通常没有检测死锁的机制。
2.lock的对象是事务,用来锁定数据库中的对象,如表、页、行。并且在事务commit或rollback后进行释放,有死锁机制。
在这里插入图片描述

 查看latch   命令show engine  innodb mutex
 查看lock    命令show engine innodb  status

三. InnoDB存储引擎中的锁

1.锁的类型

两种标准的行级锁
1)共享锁(S Lock),允许事务读一行数据。
2)排他锁(X Lock), 允许事务删除或更新一行数据。
假如一个事务T1已经获得了行r的共享锁,那么事务T2、T3等事务都可以立即获得行r的共享锁,因为读取并没有改变行r的数据,这种情况为锁兼容。但如果事务T3想要获取行r的排他锁,则必须等待T1、T2释放行r上的共享锁,这种情况为锁不兼容。
注意行锁是针对同一行数据。
3)多粒度锁
这种锁定允许事务在行级上的锁和表级上的锁同时存在。
4)意向锁
意向锁是将锁定的对象分为多个层次,简单说就是我们可以根据自己的意愿在各个层次加锁操作,实现了不同粒度上进行加锁操作。如果需要对某页上的的记录r进行上X锁,那么分别需要对其所属数据库A、表、页上加意向锁IX,最后对记录r上X锁。其中任何一部分导致等待,那么该操作需要等待粗粒度锁完成。如图6-3所示。在这里插入图片描述

InnoDB支持两种意向锁:
1)意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁
2)意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁

2.information_schema下三张监控锁的表

     1)INNODB_TRX    可以清楚的看到当前事务信息。

在这里插入图片描述

2)INNODB_LOCKS 可以清楚看到当前锁的信息。
在这里插入图片描述

3)INNODB_LOCK_WAITS 可以清楚看到哪个事务阻塞了另一个事务。
在这里插入图片描述

  另外可以将三张表进行一个联合查询,可以更直观的看到详细信息。

4.一致性非锁定读

一致性的非锁定读是指InnoDB通过行多版本并发控制的方式来读取当前执行时间数据库中行的数据。如果我们读取的行正在执行DELETE或UPDATE,这时候读取操作不会等待行锁的释放,而是去读取行的一个快照信息。该机制极大的提高了数据库的并发性。
快照数据可能有多个版本,由此带来的并发控制称之为多版本并发控制(Multi Version Concurrency Control,MVCC)。
在事务隔离级别READ COMMITTED(读已提交)和REPEATABLE READ(InnoDB默认的事务隔离级别,重复读)下使用非锁定的一致性读。在READ COMMITTED事务隔离级别下,非一致性读总是读取被锁定行的最新一份快照数据。而在REPEATABLE READ事务隔离级别下非一致性读总是读取事务开始时的行数据版本。

5.一致性锁定读

在默认配置情况下,InnoDB的select操作使用的是一致性非锁定读,如果在某些情况下我们想要使用对数据库读取操作进行加锁保证数据逻辑的一致性,就需要支持加锁语句,InnoDB对select语句支持了两种一致性的锁定读操作:
1)select … for update 对读取 的行加一个X锁
2)select … lock in share mode 对读取的行加一个S锁
对于一致性非锁定读,即使读取的行执行了select … for update也是可以进行读取的。
5.自增长与锁
自增长在数据库中是非常常见的一种属性,在InnoDB存储引擎内存结构中,对每个含有自增长值得表都有一个自增长计数器。当对这个表插入数据时,这个计数器就会被初始化,插入操作会依据自增长的计数器值+1。这个实现方式称为AUTO-INC Locking。这种锁在完成插入的sql语句后会立即释放。
从Mysql5.1.22版本开始,InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,其默认值为1。自增长的插入分类和各参数下对不同的插入分类影响如下图:
在这里插入图片描述
在这里插入图片描述
在InnoDB中,自增长列必须是索引,同时必须是索引的第一个列 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值