`

数据库死锁&数据库锁知识点

 
阅读更多
参考:https://www.cnblogs.com/yelongsan/p/9405914.html
参考带图:https://www.wengbi.com/thread_94416_1.html
技术内幕四维图:[url]https://blog.csdn.net/tanliqing2010/article/details/81509539 [/url]

什么是数据库死锁:

1.阻塞现象

程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。

2.阻塞原理:
当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。

3.死锁现象:
第一个连接占有资源没有释放,准备获取第二个连接所占用的资源,而第二个连接占有资源没有释放,准备获取第一个连接所占用的资源。
这种互相占有对方需要获取的资源的现象叫做死锁。
对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。

4.死锁原理:
两个进程并发处理业务AB,业务A先后处理表a表b,业务B先后处理表b表a,业务A锁定等待提交a,业务B锁定等待提交b,此时业务A继续抢占表b,业务B继续抢占表a,但表a表b彼此被另一方锁定,这种相互占有对方需要的资源是数据库死锁。
此锁可对表所有数据行加锁,也可对表某一行加锁。

5.根据死锁所需要的4大条件,提出解决方案:
1)互斥条件:
指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
进程A处理表a表b,进程B等待进程A处理完成。
2)请求和保持条件:
指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
3)不剥夺条件:
指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
4)环路等待条件:
指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
以固定的顺序访问表和行

6.下列方法有助于最大限度地降低死锁:
1)以固定的顺序访问表和行。即按顺序申请锁,这样就不会造成互相等待的场面。
进程A处理表a表b,进程B也处理表a表b。
2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
进程A处理表a表b事务拆开,进程B也处理表a表b事务拆开。
3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
进程A处理表a表b,同时锁定表a表b,不被进程B占用。
4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR(repeatable read)调整为RC(read commit),可以避免掉很多因为gap(间隙锁)锁造成的死锁。
进程A和进程B,是用隔离级别低的事务,要对spring的隔离级别由了解
比如使用UNCOMMITTED,允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
5)为表添加合理的索引。如果不走索引将会为表的每一行记录添加上锁(表锁),死锁的概率大大增大。
意思是如果走索引,记录只会加行锁,减少死锁的概率。

7.此问题会延伸到数据库索引和锁知识点,每个知识点看似简单,但让你说说看,估计就GG了。
推荐 https://www.cnblogs.com/yelongsan/p/9405914.html

1).InnoDB行锁和表锁都支持!
MyISAM只支持表锁

2).InnoDB只有通过索引条件检索数据才使用行级锁,否则,InnoDB将使用表锁
也就是说,InnoDB的行锁是基于索引的!

3).InnoDB和MyISAM有两个本质的区别:
InnoDB支持行锁
InnoDB支持事务

4).共享锁(S锁)/读锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
也叫做读锁:读锁是共享的,多个客户可以同时读取同一个资源,但不允许其他客户修改
共享锁--读锁--S锁:SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排它锁--写锁--X锁:SSELECT * FROM table_name WHERE ... FOR UPDATE。

排他锁(X锁)/写锁:允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
也叫做写锁:写锁是排他的,写锁会阻塞其他的写锁和读锁。
用写锁锁表,会阻塞其他事务读和写
对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)

5)意向锁:
innodb中有行锁和表锁。
正常情况下,加了行锁,表锁需要查询每一行是否加了行锁,才进行加表锁成功。
这里,innodb有了意向锁的含义,在加行锁的同时数据库自动加了表的意向锁,不必再去查每一行是否加行锁,表锁只需要查询有没有意向锁就好。

https://www.zhihu.com/question/51513268

行锁->表锁,表锁不需要再每一行去检查有没有行锁,直接有没有之前加过的意向锁,有了阻塞等待,没有加表锁。注意在第一步加行锁时,是数据库自动完成申请一向锁,意向锁不需要我们自行添加

为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁:
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁,共享锁被阻塞。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁,排他锁被阻塞。
step1:判断表是否已被其他事务用表锁锁表
step2:发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞。

6)数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别

首先我们回忆下spring隔离级别:
隔离级别:
ISOLATION_DEFAULT 使用后端数据库默认的隔离级别。
read uncommitted:
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
隔离级别最低,并发性能高,没有排它锁,因为可以更改所以也没有共享锁。
read committed:
ISOLATION_READ_COMMITTED 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
把释放锁的位置调整到事务提交之后,此时在事务提交前,其他进程是无法对该行数据进行读取的,包括任何操作
加了排他锁,锁定正在读取的行
repeatable read:
ISOLATION_REPEATABLE_READ 可保证对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。
可防止脏读和不可重复读,但幻影读仍可能发生。
锁定已读取的所有行
幻读:在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。使用gap间隙锁,把其他空业务数据也给锁定,可防止幻读。
serlializable:
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。
这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。
完全隔离

7)乐观锁:update A set Name=lisi,version=version+1 where ID=#{id} and version=#{version}
悲观锁:select * from xxxx for update 手动加行锁排他锁

8)间隙锁GAP,只会在可重入读的隔离级别使用,比如>100,即便数据库没有102,也会把id=102加行锁。

9)MVCC(Multi-Version Concurrency Control)多版本并发控制
可以简单地认为:MVCC就是行级锁的一个变种(升级版)。
MVCC一般读写是不阻塞的(所以说MVCC很多情况下避免了加锁的操作)
读写不阻塞:多版本并发控制--->通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本。

语句级锁
针对于Read committed隔离级别,每次都是读语句级别数据快照(Snapshot),每次读取的都是当前最新的版本。
事务级别锁
针对于Repeatable read隔离级别,避免不去重复读是事务级别的快照!

可以从回答read_commmit,repeatable read实现原理得到答案:
read_commmit语句级快照,每次读取最新版本的快照;
repeatable read事务级别的快照,表里每个数据行都隐式有版本和过期时间的字段,一个事务来处理,会获取小于等于当前版本号的数据(数据快照)

总结:
InnoDB基于行锁还实现了MVCC多版本并发控制,MVCC在隔离级别下的Read committed和Repeatable read下工作。MVCC能够实现读写不阻塞!
InnoDB实现的Repeatable read隔离级别配合GAP间隙锁已经避免了幻读!

分享到:
评论

相关推荐

    《数据库系统概论》知识点总结.docx

    《数据库系统概论》知识点总结全文共10页,当前为第1页。《数据库系统概论》知识点总结全文共10页,当前为第1页。一、选择题: 《数据库系统概论》知识点总结全文共10页,当前为第1页。 《数据库系统概论》知识点...

    MySQL数据库:锁定与解锁.pptx

    数据库编程 锁定与解锁 课程目标 了解 —— 锁定和解锁的概念; 掌握 —— 锁定和解锁的设置; 锁定与解锁 MySQL提供了LOCK TABLES语句来锁定当前线程的表,语法格式如下: LOCK TABLES tbl_name [AS alias] {READ ...

    数据库知识点总结

    什么是数据库事务?数据库事务的四个特性是什么?2. 请分别举例说明幻读和不可重复读,并描述一下它们之间的区别3. Mysql的默认隔离级别是什么?那么Mysql在实际企业中一般使用的隔离级别是什么吗?为什么?4. 为...

    数据库经典笔试题总结 -- 相当全面

    数据库经典笔试题,知识点很全面,每个知识点都有详尽解释,主要包括: 范式,索引,备份,死锁,数据库操作,SQL语法等等,非常全面!!!

    数据库系统及应用课程总结.docx

    一、数据库主要知识点 本书分为四个部分,第一部分是数据库基础,第二部分利用SOLServer介绍基于客户/服务器机制的数据库管理系统、数据库保护技术和分布式数据库;第三部分介绍数据库系统的开发、数据库设计等;第...

    mysql中的事务、锁讲解和操作

    以上内容,将涵盖MySQL事务和锁的核心原理和实践所需的知识点。无论您是新手还是专业开发人员,本资源都将为您提供丰富的知识储备和实际应用技巧,让您在实际项目中更好地运用MySQL的事务和锁功能,提高您的工作效率...

    数据库系统实现

    1.3.1 预备知识 1.3.2 存储管理概述 1.3.3 查询处理概述 1.3.4 事务处理概述 1.3.5 信息集成概述 1.4 数据库模型和语言回顾 1.4.1 关系模型回顾 1.4.2 SQL回顾 1.4.3 关系的和面向对象的数据 1.5 ...

    MySQL数据库面试题(50道题含答案和思维导图总结)

    关于MySQL常见的知识点总结了一个思维导图分享给大家,希望对大家有所帮助! 1、MySQL 中有哪几种锁? (1)表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最 高,并发度最低。 (2)行级锁:...

    db-tutorial是数据库db-tutorial是一个数据库教程

    关键词: ACID , AUTOCOMMIT ,事务隔离级别死锁,死锁,分布分布式事务 :hammer:其他关系型数据库Nosql数据库整理主流Nosql数据库知识点。 :books: :hundred_points: :high_voltage: -关键词:内存淘汰,事件,...

    Oracle学习笔记(事务知识点)

    Oracle学习笔记(事务知识点),事务处理:所谓的事务处理其实就是保证数据操作的完整性,所有的操作要么同时成功,要么同时失败

    一次性搞定数据库事务

    彻底搞清楚MySQL的各种锁:行锁、表锁、共享锁、排它锁、Next-Key锁、间隙锁、X锁、S锁、IS锁、IX锁、死锁、索引与锁、意向锁等。 彻底搞清楚Spring事务的7种传播级别的原理和使用:PROPAGATION_REQUIRED、...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    本书的每一章都提供吸引人的练习题、实践问题和本章知识点回顾以强化所学的知识。本书既是帮助读者轻松地通过oca/ocp认证考试的好帮手,也是oracle从业人员必备的参考书。  本书全面覆盖了1z0-051、1z0-052和1z0-...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    本书的每一章都提供吸引人的练习题、实践问题和本章知识点回顾以强化所学的知识。本书既是帮助读者轻松地通过oca/ocp认证考试的好帮手,也是oracle从业人员必备的参考书。  本书全面覆盖了1z0-051、1z0-052和1z0-...

    100道mysql的面试题

    2. 文档内容包括mysql索引,索引失效,覆盖索引,回表,二叉树,死锁,读写分离,分库分表,分库分表中间件,聚集索引或非聚集索引, 索引优化,事务级别,幻读,脏读,不可重复读,数据库的乐观锁和悲观锁,SQL优化...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的呕心力作,数据库管理员的实战宝典,全面、深入地剖析SQL Server2008新特性,结构...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的呕心力作,数据库管理员的实战宝典,全面、深入地剖析SQL Server2008新特性,结构...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    完全根据考试要求来阐述每一个知识点 提供可供搜索的Ebook(英文版)和训练题 提供实际场景案例分析和故障诊断实验 SQL Server专家的呕心力作,数据库管理员的实战宝典,全面、深入地剖析SQL Server2008新特性,结构...

    sqlserver中with(nolock)深入分析

    在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST的一些技术知识点: 对于非银行等严格要求事务的行业,搜索记录中出现...

Global site tag (gtag.js) - Google Analytics