MySQL 基础知识梳理学习(六)----锁

1.什么是锁:

对共享资源进行并发访问控制,提供数据的完整性和一致性。

2.锁的区别:

类型 lock latch
对象 事务 线程
保护 数据库内容 内存数据结构
持续时间 整个事务过程 临界资源
模式 行锁、表锁、意向锁 读写锁、互斥量
死锁 通过waits-for graph、time out等机制进行死锁检测与处理 无死锁检测与处理机制。仅通过应用程序加锁的顺序(latch leveling)保证无死锁的情况发生。
存在于

Lock Manager的哈希表中

每个数据结构对象中

latch是针对程序内部的资源(比如:全局变量)的锁的定义,而这里的lock针对的是数据库的事务。

lock由latch来保证和实现。

3.锁是用来实现并发控制,并发控制用来实现隔离级别,隔离级别是通过锁来控制的,锁的目的为了使得事务之间的执行是序列化的。

4. 什么是隔离性

一个事务所做的修改,对其它事务时不可见的,好似是串行执行的。

隔离级别越低,事务请求的锁越少或者保持锁的时间就越短。

5.MySQL事务的隔离级别

事务隔离级别 脏读 不可重复读 幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

MySQL 默认的事务隔离级别为repeatable-read。

6.什么是脏读、不可重复读、幻读

(1)脏读:事务A读取了事务B更新(插入)的数据,然后B回滚操作,那么A读取的数据是脏数据。即尚未提交(commit)的数据,被其他的事务读取了。

(2)不可重复读:事务A多次读取同一数据(同一条记录),事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。

(3)幻读:在同一个事务中,执行两次相同的SQL,等到不同的结果集,(新增了部分记录或者缺失了部分记录)(与不可重复读操作对象不一样,此处,不是同一条记录)。

小结:不可重复读和幻读很容易混淆,不可重复读偏重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

7.MySQL InnoDB支持三种行锁定方式

Record Lock 单个行记录上的锁;
Gap Lock 锁定一个范围,但不包含记录本身;间隙锁是针对事务隔离级别为可重复读或以上级别,解决了幻读的问题。locking reads,UPDATE和DELETE时,除了对唯一索引的唯一搜索外都会获取gap锁或next-key锁。即锁住其扫描的范围。
Next-Key Lock Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。

8.(1)事务隔离级别为读提交时,写数据只会锁住相应的行。

 (2)事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。

 (3)事务隔离级别为串行化时,读写数据都会锁住整张表

 (4)隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

9.间隙锁锁定的区域
根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。

10.死锁

死锁是两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。

我们一般通过锁超时机制来解决死锁。参数为--innodb_lock_timeout. 而设置innodb_print_all_deadlocks 可决定是否将死锁信息打印到err_log中。

 

(If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.)

 

posted @ 2019-01-31 16:33  东山絮柳仔  阅读(402)  评论(0编辑  收藏  举报