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

 

 总结

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

转载于:https://www.cnblogs.com/wenBlog/p/5217103.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言位运算符的使用_C语言程序使用位运算符检查给定数字是否为回文

c语言位运算符的使用Problem statement: Write a C program to check whether a number (binary representation) is palindrome or not using bitwise operators. Maximum input is 255.. 问题陈述:编写一个C程序以使用按位运算符检查数字(二进制​​表示形式)是否…

解析取值_圆锥曲线——高中解析几何全归纳

这是一系列文章,我将在接下来了80多天,尽力把理科比较难的大题题型全部归纳一下然后在最后我会告诉做解析几何的窍门,让你的解析几何不再没有头绪,拿到既可做全文干货,不掺水,可以说总结了解析几何中你能遇…

Tomcat版本与Servlet、JSP等版本的支持关系

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/garyxiong/blog/624619

php 随机两位小数数_使用8086微处理器找出两个8位N数数组

php 随机两位小数数Problem statement: 问题陈述: Write a program in 8086 microprocessor to find out the sum of two arrays of 8-bit n numbers, where size “n” is stored at offset 500 and the numbers of first array are stored from offset 501 and t…

人类一败涂地做图教程_绘画步骤_人类一败涂地鼠绘人物步骤与技巧_3DM单机

第一波根据自己喜欢的人物角色选好模型,模型选不好画出来就不像第二步 对模型进行上色 在上色时可选择对某一部位涂色第三步绘制人物服装细节,首先是起个大概的形状 ,ALT镜头拉进,画笔最小化,然后利用底色扣细建议先从…

java向数组中增加新元素_用Java中的新元素替换List的给定索引处的元素

java向数组中增加新元素Given a list of the integers and we have to replace it an element from specified index with a new element in java. 给定一个整数列表,我们必须用Java中的新元素将其替换为指定索引中的一个元素。 To replace an element in the list…

微服务架构会和分布式单体架构高度重合吗

在最近的Microservices Practitioner Summit峰会上,来自Facebook的工程师Ben Christensen就目前正在普遍快速增长的分布式系统与二进制依赖关系的一种反面模式发表了自己的看法。\\Christensen谈到说,共享类库是整个服务运行过程中最需要的部分&#xff…

北京soul_Soul高智商情侣,机器人博士邂逅科技记者,跨越1200公里来相爱

她,是知名媒体的科技记者,平时往返于帝都各大互联网媒体峰会上,朋友圈都是各大互联网公司创始人大佬,用文字记录下互联网江湖的风云变化。他,是魔都top大学的工业机器人博士,像谢尔顿一样充满科学的奇思妙想…

数据库拆分字符串函数_PHP | 不使用库函数将逗号分隔的字符串拆分为数组

数据库拆分字符串函数Given a string with comma delimited, we have to split it into an array. 给定一个以逗号分隔的字符串,我们必须将其拆分为一个数组。 Example: 例: Input: "Google,Bing,Yahoo!,DuckDuckGo"Output:arrar of strings…

arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒

最近在做一个低功耗的设备,发射红外来检测前面1米以内左右的地方是否有人,纽扣电池供电,需要持续工作至少两年,因此,要求设备工作电流在ua级别。(1)红外发射接收由于一般的红外发射接收(下图所示)都会比较…

Android-Dialog

Android-AlertView 我的地址:https://github.com/kongqw/Android-AlertView 开源地址:https://github.com/saiwu-bigkoo/Android-AlertView

mysql卸载后重装失败_小筑教育BIM课堂-Revit100问 [第二期] | 软件卸载

1、Revit未卸载干净,导致安装失败,怎么办?答:方法1:利用官方软件卸载工具UninstallTool软件将剩余残留未卸载子程序卸载干净,之后再安装Revit。方法2:如果UninstallTool软件检索不到电脑上还有相…

hdu 5631 Rikka with Graph(图)

n个点最少要n-1条边才能连通&#xff0c;可以删除一条边&#xff0c;最多删除2条边&#xff0c;然后枚举删除的1条边或2条边&#xff0c;用并查集判断是否连通&#xff0c;时间复杂度为O&#xff08;n^3&#xff09; 这边犯了个错误&#xff0c; for(int i0;i<N;i){ fa[i]i;…

电机编码器调零步骤_蒂森电梯编码器整定和主机整定大全

CT 编码器整定操作步骤1. 断开电源&#xff0c;吊起轿厢&#xff0c;空开曳引轮钢丝绳。2. 取出主板 JP5 的 9 与 10.11.13 的线并短接一起。3. 送电后确认 KAS,KAD,继电器吸合&#xff0c;接触器 KM1,KM2,KM3 也吸合&#xff0c;抱闸自动张开。注&#xff1a;保证安全回路 102…

4 曝光_荣耀户外手表GS Pro曝光:超强续航 9月4日发布

8月21日消息&#xff0c;荣耀海外官微今日官宣&#xff0c;荣耀首款主打户外功能的手表&#xff0c;将于9月4日海外发布。从其预热海报来看&#xff0c;这款手表应该就是国内已官宣的荣耀GS Pro。因为两张海报中的手表新品外观一致&#xff0c;均采用三防设计&#xff0c;圆形表…

atitit.atiOrmStoreService 框架的原理与设计 part1  概述与新特性

atitit.atiOrmStoreService 框架的原理与设计 part1 概述与新特性 1. 新特性如下 支持生成sql在无数据库连接的情况下 2. Orm设计 主要的俩个以来service如下 Inject Dsl2sqlService dsl2sqlSvr; Inject DBX dbSvr; 作者:: 绰号:老哇的爪子 &#xff08; 全名&#xff1a;&…

lightgbm 保存模型 过大_机器学习之12—Lightgbm

Lightgbm模型和GBDT以及XGboost一样&#xff0c;都是基于决策树的boosting集成模型&#xff1b;Lightgbm是一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。关于GBDT和XGboost的介绍可以参考&#xff1a;大饼&#xff1a;机器学习——提升算法(A…

python3 装饰器

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # encoding: utf-8 # author: eddy # contact: 278298125qq.com # site: http://my.oschina.net/eddylinux # file: study_deco.py # time: 2016-02-28 12:06 # version: 1.0#基础知识 #### 第一…

判断是否大于_电动车是否属于机动车的辩论要点

现行国家标准GB/T 24158-2009在3.1章节中对电动摩托车与电动轻便摩托车进行了定义,但将要在2019年4月1日实施的新标准却删除了该定义.在09标准中对电动轻便摩托车进行了如下定义:所以说,大于20km/h或大于40kg的电动车为机动车.但是这个标准删除了故对于电动车是否属于机动车不应…

Vim常用按键操作学习

对于Vi的学习&#xff0c;在这里算是做个笔记&#xff0c;对于一些常用的命令记录下&#xff0c;以后在使用起来会更方便&#xff0c;便于以后查阅使用&#xff0c;而不需要再从去搜索。读到这你应该看出&#xff0c;这是一个笔记了&#xff0c;会比较干了。补充一句&#xff0…