`

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

 
阅读更多
参考: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间隙锁已经避免了幻读!

分享到:
评论

相关推荐

    oracle数据库解决死锁

    Oracle数据库解决死锁 Oracle数据库解决死锁是指在Oracle...解决Oracle数据库死锁问题需要具备一定的数据库管理知识和PL/SQL编程技能。同时,也需要了解Oracle数据库的工作原理和死锁机理,以便更好地解决死锁问题。

    20 数据库高频知识点.docx

    ### 数据库高频知识点详解 #### 事务四大特性(ACID) **1. 原子性(Atomicity)** 原子性是指事务中的所有操作要么全部完成,要么一个也不执行。这意味着事务作为一个整体来处理,其操作序列要么完整地应用于...

    DB2数据库处理表死锁

    ### DB2数据库处理表死锁知识点详解 #### 一、理解DB2中的死锁与锁机制 在DB2(Database 2)这种关系型数据库管理系统中,锁是一种用于确保数据一致性和完整性的关键机制。当两个或多个事务互相等待对方释放资源时...

    数据库概论知识点

    ### 数据库概论知识点 #### 一、选择题解析 1. **删除操作**:“DELETE FROM 表名”表示从数据库的基本表中删除所有的记录,而不是删除表中的所有属性。 2. **事务特性**:事务的四个特性是原子性(Atomicity)、...

    浙江省计算机三级数据库知识点.pdf

    然而,我可以根据标题“浙江省计算机三级数据库知识点.pdf”推测文档可能涵盖的知识点,并提供一个大致的知识框架。 根据浙江省计算机三级数据库考试大纲,以下是可能的知识点: 1. 数据库基础知识:包括数据模型...

    考研数据库知识点.7z

    这个压缩包包含了一系列与数据库相关的知识点,旨在帮助考生深入理解并掌握数据库领域的核心概念和技术。以下是这份资料可能涵盖的重要知识点的详细解析: 1. **数据库基本概念**: - 数据库(Database):存储...

    数据库系统基础教程_数据库基础_数据库系统_数据库pdf_

    此“数据库系统基础教程”将详细介绍以上各知识点,并可能包含实际操作示例、练习题和案例研究,以帮助读者更好地理解和应用数据库系统。通过学习本教程,你可以掌握数据库的基本概念和操作,为后续的数据库开发和...

    数据库三级知识点.rar

    以下是根据标题、描述和标签整理出的一些关键数据库知识点: 1. **数据库基本概念**: - 数据库(Database):存储和管理数据的系统,提供数据的组织、存储、检索和管理功能。 - 关系数据库:基于关系模型的...

    《数据库原理》知识点.pdf

    《数据库原理》知识点 在数据库领域,《数据库原理》是基础理论课程,涉及数据模型、关系代数、数据库安全、数据库设计、查询优化、事务处理等多方面的知识点。本文档对《数据库原理》知识点进行了系统的总结和梳理...

    2019年上半年数据库系统工程师【上午&下午】真题&&参考答案&&详解.zip

    上午的考试通常涵盖基础理论、数据模型、数据库设计、SQL语言、事务处理、并发控制、备份恢复、性能调优等核心知识点。数据模型包括关系模型、网络模型、层次模型等,考生需理解它们的概念和特点。数据库设计则涉及...

    数据库重点知识点面试备考

    理解事务的并发控制,例如锁机制、乐观锁与悲观锁的区别,以及死锁的预防和解决策略。 5. **数据库备份与恢复**:了解不同类型的备份策略(如全备、增量备、差异备份),以及如何在数据丢失时进行恢复,是数据库...

    数据库基础知识点:数据库参考题

    ### 数据库基础知识点详解 #### 一、事务的特性 - **原子性(Atomicity)**: 事务被视为一个不可分割的工作单元,整个事务要么全部完成,要么完全不做。 - **一致性(Consistency)**: 事务完成后,数据必须处于...

    数据库知识点、试题资料

    这份"数据库知识点、试题资料"的压缩包显然包含了丰富的学习资源,适用于期末复习和刷题,帮助学生巩固数据库理论并提高实践技能。以下是这些资料可能涵盖的一些关键知识点: 1. **数据库系统基础**:首先,你需要...

    sql server 数据库巡检

    包括检查数据库的磁盘空间使用信息、日志文件大小及使用情况、表的磁盘空间使用信息、磁盘读写情况、I/O 工作情况、锁与等待、死锁、用户和进程信息、活动用户和进程的信息、SQL Server 的实际内存占用、所有数据库...

    如何解决Oracle杀死死锁进程

    解决 Oracle 杀死死锁进程 Oracle 杀死死锁进程是数据库管理员经常遇到的问题,...解决 Oracle 杀死死锁进程需要具备扎实的 Oracle 基础知识和解决问题的经验。通过学习和实践,可以更好地掌握解决死锁问题的方法。

    江苏科技大学数据库题库

    【标题】:“江苏科技大学数据库题库”所涵盖的知识点主要涉及数据库系统的基础理论与实践应用。这个题库可能包括了数据库设计、SQL语言、数据库管理、数据模型等多个方面,是针对江苏科技大学相关课程的复习资料。 ...

    数据库相关思维导图汇总

    在本文中,我们将详细探讨这些思维导图可能涵盖的关键知识点。 首先,思维导图可能会从数据库的基本概念开始,包括什么是数据库、数据库管理系统(DBMS)的作用以及数据库模型(如关系型数据库模型、层次模型、网络...

    浅析SQL Server数据库事务锁机制.pdf

    数据库管理员和开发人员需要深入理解这些知识点,以合理地管理事务锁,确保数据库操作的高效与安全。随着信息技术的不断发展,对于数据库事务锁的理解和应用也需要不断更新,以适应新的挑战和要求。

    数据库期末考试题(合肥工业大学)

    - **知识点**: 并发调度中使用两段锁协议(2PL)能否避免死锁。 - **解析**: 虽然两段锁协议可以在一定程度上减少并发事务间的冲突,但它并不能完全避免死锁的发生。因此,该题目的正确答案是B(×)。 #### 11. ...

Global site tag (gtag.js) - Google Analytics