sqlserver 死锁,事务(进程 ID 115)与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行该事务。

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 解决死锁问题。

业务场景:
对于同一张表进行操作,同时开了三条线程:

1.第一条线程,在满足条件时会对这张表进行快速更新,可能会持续一段时间
2.第二条线程,间隔2s,会对这张表的满足where条件的数据更新一次;
3.第三条线程,间隔2s,会对这张表select一次;

问题简单分析:

因为不同线程在事务中处理相同的数据时,在抢占数据库锁的过程中都拿到了这个表的锁,数据库会采取让一个执行而另一个放弃执行,会导致该错误的出现,即选作死锁牺牲品。

解决:
在update的语句中,加入 WITH (TABLOCKX),对于这个的解释:

排它锁又称为写锁((eXclusive lock,简记为X锁)),若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。

使用如:UPDATE MT_EXP_SUB WITH (TABLOCKX) SET XXX = XXX WHERE ID = X;
加上这个排他锁之后,这个死锁的问题变解决了。

相关实践学习
使用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
目录
相关文章
|
4天前
|
消息中间件 安全 算法
死锁和进程间通信
死锁和进程间通信
27 0
|
4天前
|
Linux
百度搜索:蓝易云【Linux系统ps命令:查看正在运行的进程】
通过这些简洁的ps命令用法,你可以方便地查看Linux系统中正在运行的进程信息。
39 1
|
4天前
|
存储 监控 Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 查看当前正在运行的进程信息 ps命令 使用指南
47 0
|
4天前
|
Linux Shell C语言
|
4天前
|
监控 Linux Shell
|
4天前
|
Linux Shell
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
|
4天前
|
弹性计算 运维 Shell
|
4天前
|
弹性计算 运维 Shell
|
4天前
|
SQL
sqlserver死锁排查
sqlserver死锁排查
30 0
|
4天前
|
Linux Shell vr&ar
进程从代码到二进制到运行时的过程
【4月更文挑战第18天】Linux系统中二进制程序的格式,介绍了ELF(Executable and Linkable Format)格式。