SQLServer中的死锁的介绍

SQLServer中的死锁的介绍

简介

     什么是死锁?

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

      什么又是阻塞?

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

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

SQLServer中的死锁

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

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

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

     <span>SQLServer中的死锁的介绍</span><span>SQLServer中的死锁的介绍</span>

 

 如图,按步骤执行:

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状态

<span>SQLServer中的死锁的介绍</span>

 

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

 

<span>SQLServer中的死锁的介绍</span>

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

<span>SQLServer中的死锁的介绍</span>

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

      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)来实现对表的查询,但是可能会差生脏读。

 

 总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119731.html原文链接:https://javaforall.net

(0)
上一篇 2021年11月26日 上午7:00
下一篇 2021年11月26日 上午8:00


相关推荐

  • 数据结构–链表的排序详解

    数据结构–链表的排序详解1、前言前面两篇博客,我已经把线性表的两种基本的表示形式,做了一个基本的介绍和一些对比。但是,我突然发现在链表这里我缺少一个很重要的内容,那就是对我们的链表进行排序,其实,在连接两个链表的时候,就要求我们的那两个链表是有序的。2、链表排序—最简单、直接的方式(直接采用冒泡或者选择排序,而且不是交换结点,只交换数据域)//线性表的排序,采用冒泡排序,直接遍历链表voidListsort(Nod

    2022年10月11日
    4
  • 解决Deepin下qq无法显示图片「建议收藏」

    解决Deepin下qq无法显示图片「建议收藏」添加内核参数彻底禁用IPv6:执行:sudodedit/etc/default/grub开始编辑文件:在此行添加参数:GRUB_CMDLINE_LINUX=”ipv6.disable=1″保存退出后执行:sudoupdate-grub执行完命令之后,重新启动系统。亲测:可以接收图片…

    2022年8月10日
    10
  • 什么是J2EE?[通俗易懂]

    什么是J2EE?[通俗易懂]什么是J2EE?J2EE是一种用来开发分布式企业软件应用系统的平台。JAVA语言从创生之日起,就获得了广泛接纳,经历了巨大的发展。越来越多的技术都成了JAVA平台的一部分,为了适应不同的需要业开发吃了很多全新的API和标准。最终,Sun公司联合了多家业界巨头,在开放的JAVA社区组织名义下,把所有与企业开发相关的标准,API整合起来,构成了J2EE平台。对于企业,J2EE平台由很多优势:

    2022年10月11日
    6
  • 数据结构与算法栈的详解_数据结构怎么判断出栈的顺序

    数据结构与算法栈的详解_数据结构怎么判断出栈的顺序一、什么是栈栈(stack)是一种先进后出的有序列表,其中的元素只能在线性表的同一端进出,允许元素插入和删除的一端被称为栈顶(top),固定的另一端被称为栈底(button)。二、数组简单实现栈

    2022年8月16日
    6
  • 从零开始搭二维激光SLAM — 前言[通俗易懂]

    从零开始搭二维激光SLAM — 前言[通俗易懂]我眼中的SLAM从最开始接触SLAM已经3年了,从二维激光SLAM到三维激光SLAM,再到视觉SLAM,都有一些接触,现将简单梳理一下SLAM的各个模块的功能以及实现方式,为本系列文章起到个总领作用。1SLAM是什么SLAM(simultaneouslocalizationandmapping)的中文翻译为同步定位与地图构建。目的有2个,一个是进行定位,一个是进行周围环境的地图的构建,二者相互依赖,只有同时进行求解才能够解决这个问题。为什么一定要同时进行求解呢?人通过眼睛,通过手部等肢体

    2022年8月23日
    8
  • 批处理删除文件夹下所有文件和文件夹

    批处理删除文件夹下所有文件和文件夹1 rd 命令 rd s Qc temp 会将 temp 文件夹也删除 2 rd 命令 md 命令 rd s Qc tempmdc Temp 删除后再重建 3 del 命令 del s Qc temp 只能删除文件 而不能删除子文件夹 4 del 命令 rd 命令 先刪除文件 再进入 temp 文件夹删除目录 del s Qc tempcdC temprd s qc temp

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号