欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-04 19:02:10
1.什么是锁: 对共享资源进行并发访问,提供数据的完整性和一致性。 2.锁的区别: Lock Manager的哈希表中 latch是针对程序内部的资源(比如:全局变量)的锁的定义,而这里的lock针对的是数据库的事务。 lock有latch来保证和实现。 3.锁是用来实现并发控制,并发控制用来实现隔 ......

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中。