DDR爱好者之家 Design By 杰米
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死锁检测的方法,希望大家喜欢。
DDR爱好者之家 Design By 杰米
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
DDR爱好者之家 Design By 杰米
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月23日
2024年11月23日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]