处理数据库死锁问题

article/2025/8/26 18:05:53

在实际的项目环境中碰到了如下的问题

Microsoft.Data.SqlClient.SqlException (0x80131904): 事务(进程 ID
98)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

怀疑是因为数据库查询和修改中产生的死锁问题,造成的上述原因。
我在百度查询出存在如下一种情况会出现这种问题。

引起这个问题主要是因为违反了事务的隔离性

隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据。
在这里插入图片描述
依次执行如上代码,就会出现我们今天讲解的问题
在这里插入图片描述
这就是因为“锁”造成的。

在执行事务的时候,如果其中有修改语句,就是更新锁,资源的更新锁一次只能分配给一个事务,如果需要对资源进行修改,更新锁会变成排他锁。
我们来分析一下上面的sql语句;

首先 我们执行左边的sql语句,执行了第一条sql语句,Dome表—延迟4秒—Domes表
然后 我们执行右边的sql语句,执行了第一条sql语句,Domes表—延迟4秒—Dome表

执行过程如下,
第一个事务更新Dome表,就为Dome表上锁;
第二个事务更新Domes表,就位Domes表上锁;
然后延迟4秒后,两个事务都要各自去更新已经上锁的表,所以这就造成了死锁,数据库发现了这种情况,就会检查选择一个合适事务作为牺牲品,牺牲品回滚数据。注意:数据库在选择牺牲品的时候,是有一套自己的判断程序的,他们会判断哪个事务更适合作为牺牲品,与执行事务的先后顺序无关,也可以设置死锁处理的优先级别,这里不多叙述。

注意:只有当事务修改的数据有冲突的时候,才会死锁,我们更新数据的时候,都是带上where条件更新某一条数据,这种情况下,只要当两个事务都是更新你指定那一条数据。才会触发死锁。

处理死锁

当 SQL Server 数据库引擎的实例选择事务作为死锁受害者时,它会终止当前批处理,回滚事务,并将错误消息 1205 返回到应用程序。

Your transaction (process ID #52) was deadlocked on {lock | communication buffer | thread} resources with another process and has been chosen as the deadlock victim. Rerun your transaction.

由于任何提交 Transact-SQL 查询的应用程序都可以选择为死锁受害者,因此应用程序应具有可捕获错误消息 1205 的错误处理程序。 如果应用程序不处理该错误,可以继续操作,但是不知道自己的事务已回滚而且可能出错。

通过实现捕获 1205 号错误消息的错误处理程序,使应用程序得以处理该死锁情况并采取补救措施(例如,可以自动重新提交陷入死锁中的查询)。 通过自动重新提交查询,用户不必知道发生了死锁。

应用程序在重新提交其查询前应短暂暂停。 这样会给死锁涉及的另一个事务一个机会来完成并释放构成死锁循环一部分的该事务的锁。 这将把重新提交的查询请求其锁时,死锁重新发生的可能性降到最低。

将死锁减至最少

尽管死锁不能完全避免,但遵守特定的编码惯例可以将发生死锁的机会降至最低。 将死锁减至最少可以增加事务的吞吐量并减少系统开销,因为只有很少的事务:

  • 回滚,撤消事务执行的所有工作。
  • 由于死锁时回滚而由应用程序重新提交。
  • 下列方法有助于将死锁减至最少:

按同一顺序访问对象。
避免事务中的用户交互。 - 使事务保持简短且一批。
使用较低的隔离级别。
使用基于行版本控制的隔离级别。
将 READ_COMMITTED_SNAPSHOT 数据库选项设置为 on,以使读取提交的事务可以使用行版本控制。
使用快照隔离。
使用绑定连接。
详情可见:https://learn.microsoft.com/zh-cn/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver16#deadlock_minimizing

解决方案:https://techcommunity.microsoft.com/t5/sql-server-support-blog/deadlock-simulator-app-for-developers-how-to-handle-a-sql/ba-p/334019


http://chatgpt.dhexx.cn/article/HEsmoc1U.shtml

相关文章

数据库死锁:原因和解决办法

理解数据库中的死锁 在数据库的上下文中,死锁是指两个或多个事务无法进行的情况,因为每个事务都在等待另一个事务释放资源。这可以类比为事务的循环链,每个事务都在等待链中的下一个事务释放资源。以下是一个死锁场景的视觉表示:…

Java面试必问:死锁(多线程死锁+数据库死锁)

死锁 接下来从几个方面介绍: 多线程死锁多线程死锁解决办法数据库死锁数据库死锁解决办法 多线程死锁是怎么造成的? 多线程锁定同一资源会造成死锁线程池中的任务使用当前线程池也可能出现死锁 参考连接: https://blog.csdn.net/qq_3506…

MySQL数据库死锁了,该怎么办?一文全解最新教程

文章目录 正文死锁的发生为什么会产生死锁?Insert 语句是怎么加行级锁的?1、记录之间加有间隙锁2、遇到唯一键冲突 如何避免死锁? 之前分享过 MySQL 死锁的文章,然后很多读者对「插入意向锁」认识很迷糊。 大家误以为「插入意向锁…

5 分钟理解数据库死锁

图片来源:网络 文章目录 死锁是如何产生的?如何解决并避免死锁总结 🍺知人者智,自知者明。胜人者有力,胜己者强。知足者富,强行者有志。不失其所者久,死而不亡者寿。——老子 大家好&#xff01…

数据库死锁场景

场景一: 单一线程多次进入子事务发生死锁 问题: 线上问题发生了死锁,但通过死锁日志发现一直在等待查询结果。我们使用的数据库是PGsql,默认的隔离级别是“读已提交”,按理来说查询不会加锁,导致一度被带偏…

数据库常见死锁原因及处理

目录 前言什么是死锁死锁产生的四个必要条件 1. 表锁死锁死锁场景解决方案建议 2. 行锁死锁2.1 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁死锁场景解决方案 2.2 共享锁转换为排他锁死锁场景解决方案 3. INSERT ... ON DUPLICATE KEY UPDATE…

数据库死锁分析与解决

一、死锁的表现 1、错误信息是:事务(进程 ID)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。 2、错误信息是:事务(进程 ID )与另一个进程被死锁在 锁 | 通信缓冲区 资源上,并且已被选作死锁牺牲品。请重新运行该事务。 二、…

数字 IC 技能拓展(1)Xilinx_Vivado_SDK_2019.1 安装详细教程

引言 工欲善其事必先利其器,而君之“器”尚无,就更别谈“事”了。赶紧!我们需要下载并安装一个 Xilinx Vivado 软件!!接下来就飞速地开始我们的 Xilinx_Vivado_SDK_2019.1 详细安装教程!!&#…

win10安装vivado + vitis 2019.2 教程

win10安装vivado vitis 2019.2 教程 安装包:链接:https://pan.baidu.com/s/1fPlNDzpC0EPXMhOloDyzfA 提取码:1234 网上其他博主的安装教程,比如:vivado2019.2的安装,最后是没有安装上vitis PS端开发软件…

vivado入门教程

vivado入门教程 基本步骤例程实现 第一次写博客,也是第一次使用vivado,自己也在学习之中,欢迎大家的评论啊! 基本步骤 一、新建工程 二、选择工程路径及命名 三、一路next到下图,确定芯片的型号 四、添加源文件 五…

手把手教你安装vivado2015.4开发环境

//vivado2015.4安装教程 //作者:紫菜蛋花汤 //时间:2018.7.8 //版本:V1 准备工作: 1.vivado2015.4安装包 官方下载压缩包文件名:Xilinx_Vivado_SDK_2015.4_1118_2.tar 个人百度云连接:https://pan.ba…

Vivado 2015.4 安装教程(含license)

首先先下载vivado2015.4的压缩文件,可以从网盘里下载: 百度网盘链接:点击链接 下载后解压: 点击xsetup.exe文件 点击Next 点击Next 一定要选择第一个Vivado HL WebPack,不要像图中那样选择第三个,因为第一…

vivado 2017.4安装步骤

目录:windows安装vivado2017.4;虚拟机ubuntu安装vivado 2017.4;ios安装vivado。 一,windows安装vivado2017.4 xilinx官网下载地址为:https://www.xilinx.com/support/download.html 下载完解压后,如图所示…

vivado2019.2安装+license添加教程

vivado2019.2安装license添加教程 注意: 1.电脑的账户名字一定是英文; 2.压缩文件夹有30个G,安装后会更大,需要预留足够的空间。 1.资源链接 百度网盘: https://pan.baidu.com/s/1xEuB-vzoXWpj40fd1wAEFg 密码:tkk1…

[Software]Vivado 2018.2 安装及激活教程

一、安装 1、 解压文件 注:要将压缩文件解压至无中文的路径中。 2、 双击“xsetup.exe”文件,开始安装 3、 不选择新版本,选择继续安装此版本 4、 点击“Next”出现协议,在“I Agree”前都打勾 5、 版本选择,用户可以…

Vivado的下载和安装

本文是自己在安装和使用vivado的一个简单记录。 在安装之前进入官网下载好自己需要版本的安装包,软件安装包比较大,需要花费比较长的一段时间。 vivado官网下载地址 :下载地址 安装好软件后需要使用到license文件,可以去官网申…

Vivado2021.2版本安装教程

Vivado2021.2版本安装教程 2021.2版本提取链接:https://pan.baidu.com/s/12P7twkEVErKmqTmkhTnvMg 提取码:2hyr。 第一步:首先打开解压好的软件,找到xsetup.exe,然后管理员模式运行,出现以下界面,点击Next。…

Vivado安装教程详细版

之前问过大佬,哪个版本的vivado更加稳定,大佬说2017.4,于是俺就安装了一个。 安装步骤: 关闭360等杀毒软件。 下载解压后,双击打开这个xsetup程序: 弹出 点击Continue 三个I Agree全部勾选,…

Vivado 2018.3 安装步骤及 license 获取

本文的主要内容是介绍 Vivado 2018.3 版本的安装步骤及其 license 的获取与加载。 首先下载安装包,将其在没有中文的路径下解压。注意在解压前最好关闭电脑的杀毒软件,防止某些文件被拦截或者删除! 解压完成后打开文件夹,在最底部…

Vivado的安装以及使用_入门

Vivado的安装以及使用 零. Vivado简要介绍 Vivado是FPGA厂商赛灵思提供的一款EDA(Electronic Design Automation)工具. 在电子设计自动化方面, 其主要提供了四种功能: RTL代码编写, 功能仿真, 综合(synthesis)以及实现(implementation). 其中, RTL代码…