详解SQL死锁检测的方法_MsSql

sql server中的死锁是指进程之间互相永久阻塞的状态,下文就将为您介绍如何检测sql server死锁,希望对您有所帮助。

死锁(deadlock)指进程之间互相永久阻塞的状态,SQL可以检测到死锁,并选择终止其中一个事务以干预sql server死锁状态。

第一步:首先创建两个测试表,表goods_sort和goods

表goods_sort:创建并写入测试数据

IF EXISTS(SELECT name FROM sysobjects WHERE name='goods_sort' AND xtype='U')
DROP TABLE dbo.goods_sort
--创建商品分类表
CREATE TABLE dbo.goods_sort(
iSortID int NOT NULL
CONSTRAINT PK_iSortID PRIMARY KEY
IDENTITY(1001,1),
sSortName NVARCHAR(20) NOT NULL
)
GO
INSERT INTO dbo.goods_sort VALUES('服饰')
INSERT INTO dbo.goods_sort VALUES('女包')
INSERT INTO dbo.goods_sort VALUES('鞋子')
INSERT INTO dbo.goods_sort VALUES('首饰')
INSERT INTO dbo.goods_sort VALUES('美容')
GO

表goods:创建并写入测试数据

IF EXISTS(SELECT name FROM sysobjects WHERE name='goods' AND xtype='U')
DROP TABLE dbo.goods;
--创建商品表
CREATE TABLE dbo.goods(
iID int NOT NULL
CONSTRAINT PK_iID PRIMARY KEY
IDENTITY(1,1),
iGoodsID varchar(20) NOT NULL,
sGoodsName nvarchar(100) NOT NULL,
iGoodTotal int NOT NULL
CONSTRAINT DF_iGoodTotal DEFAULT(0),
iPrice int NOT NULL
CONSTRAINT DF_iPrice DEFAULT(0),
iPriceTotal int NOT NULL,
iSortID int NOT NULL,
tAddDate smalldatetime NOT NULL
CONSTRAINT DF_tAddDate DEFAULT getdate()
)
GO
INSERT INTO dbo.goods
(iGoodsID,sGoodsName,iGoodTotal,iPrice,iPriceTotal,iSortID)
VALUES('YR6001','瘦身羽绒服',20,200,4000,1001)
INSERT INTO dbo.goods
(iGoodsID,sGoodsName,iGoodTotal,iPrice,iPriceTotal,iSortID)
VALUES('YR6002','加厚羽绒服',20,300,6000,1001)
INSERT INTO dbo.goods
(iGoodsID,sGoodsName,iGoodTotal,iPrice,iPriceTotal,iSortID)
VALUES('BB7001','小黄牛皮马鞍包',30,100,3000,1002)
INSERT INTO dbo.goods
(iGoodsID,sGoodsName,iGoodTotal,iPrice,iPriceTotal,iSortID)
VALUES('BB7002','十字绣流苏包',50,150,7500,1002)
GO

第二步:创建两个会产生死锁的事务

事务1:

SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
--使用TRY-CATCH,使代码发生错误也继续运行
BEGIN TRY
BEGIN TRAN
UPDATE dbo.goods_sort SET sSortName='女鞋' WHERE iSortID=1003;
WAITFOR DELAY '00:00:05';
UPDATE dbo.goods SET sGoodsName='胖子羽绒服' WHERE iID=2;
COMMIT TRAN
END TRY
BEGIN CATCH
IF (XACT_STATE()=-1)
ROLLBACK TRAN;
--ERROR_NUMBER()值为1205则表示发生了死锁
IF (ERROR_NUMBER() = 1205)
PRINT '事务1发生了死锁'
--写SQL Server日志或者返回错误给应用程序
END CATCH
SELECT iID,sGoodsName FROM dbo.goods WHERE iID=2;
SELECT iSortID,sSortName FROM dbo.goods_sort WHERE iSortID=1003;
GO 

事务2:

SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
--使用TRY-CATCH,使代码发生错误也继续运行
BEGIN TRY
BEGIN TRAN
UPDATE dbo.goods SET sGoodsName='瘦子羽绒服' WHERE iID=2;
WAITFOR DELAY '00:00:05';
UPDATE dbo.goods_sort SET sSortName='男鞋' WHERE iSortID=1003;
COMMIT TRAN
END TRY
BEGIN CATCH
IF (XACT_STATE()=-1)
ROLLBACK TRAN;
--ERROR_NUMBER()值为1205则表示发生了死锁
IF (ERROR_NUMBER() = 1205)
PRINT '事务2发生了死锁'
--写SQL Server日志或者返回错误给应用程序
END CATCH
SELECT iID,sGoodsName FROM dbo.goods WHERE iID=2;
SELECT iSortID,sSortName FROM dbo.goods_sort WHERE iSortID=1003;
GO 

然后运行事务1,接着马上运行事务2,这种情况下某一个事务会提示发生了死锁,修改不成功。另外一个事务则完成。

第一点:使用TRY.CATCH让产生异常的事务能继续完成后面的代码。

第二点:使用WAITFOR DELAY产生造成死锁的发生环境。

第三点:使用ERROR_NUMBER()来判断是否发生事务。

第四点:发生死锁,写SQL Server日志或者返回应用程序去写日志。便于检查日志的时候发现存在死锁并做相应的修改。

以上内容给大家介绍了SQL死锁检测的方法,希望大家喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索sql死锁检测
死锁检测
sql 检测死锁、mssql 死锁、mssql 查询死锁、mssql 查看死锁、mssql 数据库死锁,以便于您获取更多的相关知识。

时间: 2024-09-30 10:33:07

详解SQL死锁检测的方法_MsSql的相关文章

详解SQL死锁检测的方法

sql server中的死锁是指进程之间互相永久阻塞的状态,下文就将为您介绍如何检测sql server死锁,希望对您有所帮助. 死锁(deadlock)指进程之间互相永久阻塞的状态,SQL可以检测到死锁,并选择终止其中一个事务以干预sql server死锁状态. 第一步:首先创建两个测试表,表goods_sort和goods 表goods_sort:创建并写入测试数据 IF EXISTS(SELECT name FROM sysobjects WHERE name='goods_sort' A

详解SQL Server中的数据类型_MsSql

前言 前面几篇文章我们讲解了索引有关知识,这一节我们再继续我们下面内容讲解,简短的内容,深入的理解. 数据类型 SQL Server支持两种字符数据类型,一种是常规,另外一种则是Unicode.常规数据类型包括CHAR和VARCHAR,Unicode数据类型包括NCAHR和NVARCHAR.常规字符的每个字符使用1个字节存储,而Unicode数据的每个字符要求2个字节.常规字符列限制为仅仅只针对于英语,而Unicode则是针对于多种语言.两种字符数据类型的文本表示方式也不相同,在表示常规字符文本

详解SQL Server数据库状态和文件状态

数据库状态 (database states) 查询数据库的当前状态 : 1.查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列 user master go select state_desc ,[name] from sys.databases go 2.查询指定数据库的状态,通过DATABASEPROPERTYEX函数的Status属性 select DATABASEPROPERTYEX('demoData','status') go 状态: ONLIN

详解Python中的type()方法的使用

  这篇文章主要介绍了详解Python中的type()方法的使用,是Python入门中的基础知识,需要的朋友可以参考下 type()方法返回传递变量的类型.如果传递变量是字典那么它将返回一个字典类型. 语法 以下是type()方法的语法: ? 1 type(dict) 参数 dict -- 这是字典 返回值 此方法返回传递变量的类型. 例子 下面的例子显示type()方法的使用 ? 1 2 3 4 #!/usr/bin/python   dict = {'Name': 'Zara', 'Age'

详解JavaScript中的forEach()方法的使用

这篇文章主要介绍了详解JavaScript中的forEach()方法的使用,是JS入门学习中的基础知识,需要的朋友可以参考下 JavaScript数组的 forEach()方法调用数组中的每个元素. 语法 ? 1 array.forEach(callback[, thisObject]); 下面是参数的详细信息: callback : 函数测试数组的每个元素. thisObject : 对象作为该执行回调时使用. 返回值: 返回创建数组. 兼容性: 这种方法是一个JavaScript扩展到ECM

详解Python中的strftime()方法的使用

  这篇文章主要介绍了详解Python中的strftime()方法的使用,是Python入门学习中的基础知识,需要的朋友可以参考下 strftime()方法转换成一个元组或struct_time表示时间所指定的格式参数所返回gmtime()或localtime()为一个字符串. 当t不设置,所返回当前时间使用localtime()方法.格式必须是字符串.异常ValueError被挂起,如果t在任何字段的允许范围之外. 语法 以下是strftime()方法的语法: ? 1 time.strftim

详解Sql基础语法

1.创建数据库 create  database 数据库名称 2.删除数据库 drop database 数据库名称 3.备份sql server 创建备份数据的device use master exec sp_addumpdevice '名称','新的名称','路径' 开始备份 backup database pubs to 新的名称 4.创建表 create table 表名(列名1 类型,列名2 类型) 5.根据已有表创建新表 create table 新表名称 like 旧表名称 cr

关于SQL的几道小题详解(sql进阶)_MsSql

当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样的惯性思维其实早在我们度高中的时候就被领教了,所谓"万变不离其宗"吧.以下各题来自日常所见,或QQ群,或面试题,或博客园. 题目一:如下表所示,现需要按照收款员统计收款和退款合计金额. 实现结果需如下显示: 分析:想要的结果(记为表B)和源数据(记为表A)相比,有共同的列(收款员),不同的是表A的金额根据标记和收款

图文详解SQL Server 2008 R2安装配置方法_mssql2008

安装sql server2008 R2的方法,轻松简单易操作,按照操作一步一步来. 工具: sql server 2008 R2安装包一个(从网上下载) 方法/步骤: 安装包解压 解压后,打开setup.exe文件,选择安装,显示如图: 选择全新安装或向现有安装添加功能 点确定 输入 企业版序列号:R88PF-GMCFT-KM2KR-4R7GB-43K4B 点我接受许可条款,点下一步 点安装,如果操作系统没有安装.net framet3.5 sp1 ,将会自动安装. 必备环境全部通过后,点下一步