MySQL 锁

Posted lisin-lee-cooper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 锁相关的知识,希望对你有一定的参考价值。

一.什么是锁

锁机制用于管理对共享资源的并发访问,InnoDB 存储引擎会在行级别上对表数据上锁 ,从而允许对多种不同资源提供并发访问;对于MyISAM 引擎,其锁是表锁设计。

二.锁的类型

1.一致性锁定读(不可重复读)

一致性的非锁定读 指 InnoDB 存储引擎通过行多版本控制(multi versioning) 的方式来读取当前执行时间数据库中行的数据;

快照数据其实就是当前行数据之前的历史版本,每行记录可能有多个版本。一个行记录可能有不止一个快照数据,一般称这种技术为行多版本技术。由此带来的并发控制,称之为多版本并发控制,

在事务隔离级别READ COMMITTED 和REPEATABLE READ 下, InnoDB 存储引擎使用非锁定的一致性读。
在 READ COMMITTED 事务隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据(因此没有解决不可重复读);
在 REPEATABLE READ 事务隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本(解决了不可重复读问题)。

2.一致性锁定读

用户需要显式地对数据库读取操作进行加锁以保证数据逻辑的一致性。而这要求数据库支待加锁语句,即使是对于SELECT 的只读操作:

SELECT…FOR UPDATE :对读取的行记录加一个X 锁,其他事务不能对已锁定的行加上任何锁。

SELECT…LOCK IN SHARE MODE:对读取的行记录加一个S 锁,其他事务可以向被锁定的行加S 锁,但是如果加X 锁,则会被阻塞。

3.自增长与锁

在InnoDB 存储引擎的内存结构中,对每个含有自增长值的表都有一个自增长计数器(auto-increment counter) ;
插入操作会依据这个自增长的计数器值加 1 赋予自增长列。这个实现方式称做AUTO-INC Locking 。这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL 语句后立即释放。

三.锁的算法

Record Lock: 单个行记录上的锁

Gap Lock: 间隙锁,锁定一个范围,但不包含记录本身。

Next-Key Lock : Gap Lock+Record Lock,锁定一个范围,并且锁定记录

死锁:
两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象,设置innodb_lock_wait_ timeout 锁等待超时时间;

锁升级:
锁升级(Lock Escalation) 是指将当前锁的粒度降低。举例来说,数据库可以把一个表的1000 个行锁升级为一个页锁,或者将页锁升级为表锁。如果在数据库的设计中认为锁是一种稀有资源,而且想避免锁的开销,那数据库中会频繁出现锁升级现象

以上是关于MySQL 锁的主要内容,如果未能解决你的问题,请参考以下文章

mysql间隙锁 转

mysql间隙锁

mysql间隙锁

MySQL间隙锁(幻读解决原理)

mysql 间隙锁和临键锁原理

深入理解MySQL的间隙锁