SQLServer中的死锁的介绍

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文:SQLServer中的死锁的介绍简介      什么是死锁?      我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放。
原文: SQLServer中的死锁的介绍

简介

     什么是死锁?

     我认为,死锁是由于两个对象在拥有一份资源的情况下申请另一份资源,而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放。

      什么又是阻塞?

     阻塞是由于资源不足引起的排队等待现象。比如同时两个进程去更新一个表。

     这里我们可以把阻塞作为死锁的必要条件。下面我们先理解一下死锁和阻塞再来看一下我最近遇到一个问题以及解决思路。

SQLServer中的死锁

     对应到SQL Server中,当在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁;

   这些资源可能是:单行(RID,堆中的单行)、索引中的键(KEY,行锁)、页(PAG8KB)、区结构(EXT,连续的8)、堆或B(HOBT) 、表(TAB,包括数据和索引)、文件(File,数据库文件)、应用程序专用资源(APP)、元数据(METADATA)、分配单元(Allocation_Unit)、整个数据库(DB)

    下面我简单举一个例子来说明一下死锁的原理:

    

 

 如图,按步骤执行:

1. begin tran
update test1 set aaa=1

2.

begin tran

update test2 set aaa=1

update test1 set bbb=2

3.再次执行图1中的Update test2 set bbb=2

执行完成后发现数据并未插入,且一直处于running状态

 

这个时候我们通过语句查询死锁的进程和语句。得到如下结果:

 

很容易发现发生死锁的语句,也可以使用 SQL Server Profiler 分析死锁: Deadlock graph 事件类添加到跟踪。此事件类使用死锁涉及到的进程和对象的 XML 数据填充跟踪中的 TextData 数据列。SQL Server 事件探查器 可以将 XML 文档提取到死锁 XML  文件中,以后可在 SQL Server Management Studio 中查看该文件。如图:

接下来我们说一下如何处理死锁

      1.临时解决方案,先Kill 掉死锁的进程,只是暂时解决这个问题。

      2.SQL Server自动选择一条SQL作死锁牺牲品:当死锁发生时,锁监视器线程执行死锁检查,数据库引擎 选择运行回滚开销最小的事务的会话作为死锁牺牲品,返回1205 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。

服务器: 消息 1205,级别 13,状态 50,行 1 事务(进程 ID  xx)与另一个进程已被死锁在  lock 资源上,且该事务已被选作死锁牺牲品。请重新运行该事务。

     3.使用SET LOCK_TIMEOUT timeout_period(单位为毫秒)来设定请求超时。 

     4.在SQLServer 和程序两个方面都可以做代码上修正,这里不在详细描述,主要是通过发现死锁等待一段时间后再次尝试的方式来解决。

预防和避免死锁

     1.尽量减少事务执行的时间。

     2.在合理的范围内降低隔离级别。

     3.同一个事务内尽量避免出现循环对同一个表的处理。

     4.同一个事务内较少用户交互,即锁的竞争。

     5.尽量保证逻辑处理的顺序比如对表的处理都按照一个顺序进行。

     6.对于需要各种逻辑处理的表,可以通过增加索引的方式来减少锁的竞争。

     7.尽量减少非聚集索引的include 的列,也能减少外键死锁的发生。

     8.同一个对象尽量采用select 在update 前来使用。

     9.对于实时性要求不高的可以使用with(nolock)来实现对表的查询,但是可能会差生脏读。

 

 总结

      本文简单的介绍了死锁的原因,如何解决和预防。当然任何事情都是双刃剑,还要我们根据实际情况来合理减少死锁和阻塞的发生;对于不同隔离界别锁带来的问题可以看一下我之前的一篇关于锁的介绍。希望对死锁发生预防和解决有一定的帮助。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
51 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
95 0
|
2月前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
76 0
|
18天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
16 0
|
8天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
68 6
|
4天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
8 0
|
9天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
12天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
17 1
|
12天前
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
14 1