使用SQL检测死锁
第一步:首先创建两个测试表,表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检测死锁的更多相关文章
- sqlserver检测死锁;杀死锁和进程;查看锁信息
http://blog.sina.com.cn/s/blog_9dcdd2020101nf4v.html sqlserver检测死锁;杀死锁和进程;查看锁信息 ( ::)转载▼ 标签: sql 检测死 ...
- SQL Server死锁诊断--同一行数据在不同索引操作下引起的死锁
死锁概述 对于数据库中出现的死锁,通俗地解释就是:不同Session(会话)持有一部分资源,并且同时相互排他性地申请对方持有的资源,然后双方都得不到自己想要的资源,从而造成的一种僵持的现象.当然,在任 ...
- SQL Server死锁总结
1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...
- SQL Server死锁总结 [转]
1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...
- SQL Server死锁排查
1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...
- SQL Server死锁
SQL Server死锁 多个事务之间互相等待对方的资源,导致这些事务永久等待 注意是永久等待,而非长事务 死锁的4个条件 互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程 ...
- SQL Server死锁中的会话隔离级别为序列化(Serializable)实验测试
最近在分析SQL Server的死锁时,发现一个比较有意思的现象,发现死锁当中一个会话的隔离级别为序列化(Serializable),这个是让人比较奇怪的地方,我们知道SQL Server数据库的默认 ...
- SQL Server死锁产生原因及解决办法 .
其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...
- SQL Server死锁的解除方法
如果想要查出SQL Server死锁的原因,下面就教您SQL Server死锁监控的语句写法,如果您对此方面感兴趣的话,不妨一看. 下面的SQL语句运行之后,便可以查找出SQLServer死锁和阻塞的 ...
随机推荐
- Android 添加桌面快捷方式操作
/** * 为程序创建桌面快捷方式 */ private void addShortcut(){ Intent shortcut = new Intent(“com.android.launcher. ...
- linux TCP: time wait bucket table overflow
早上一台rabbitmq和Java所在的服务器,客户端反馈超级卡,看io和cpu都不高.发现六七万消息挤压,临时性问题解决之后,看/var/log/messages,发现很多TCP: time wai ...
- 高性能javascript学习笔记系列(4) -算法和流程控制
参考高性能javascript for in 循环 使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...
- 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
前言 此篇文章估计不会太长,有移除首页的风险,但是老夫(称老夫是因为我们真正的叶小钗其实都100多岁啦)是不会怕滴.所以,我来了哟! 题外话:今天我们一起还看了一道前端的面试题,而后我本来还想多找几道 ...
- 深入理解javascript---命名函数表达式
简单的说,命名函数表达式只有一个用户,那就是在Debug或者Profiler分析的时候来描述函数的名称,也可以使用函数名实现递归,但很快你就会发现其实是不切实际的.当然,如果你不关注调试,那就没什么可 ...
- 为 MDS 修改 SharePoint 2013组件
了解如何修改 SharePoint 项目中的组件以在 SharePoint 2013 中利用最少下载策略(MDS). 本文内容 为何修改 SharePoint 组件? 母版页 ASP.NET 页面 ...
- atitit.userService 用户系统设计 v4 q316 .doc
atitit.userService 用户系统设计 v4 q316 .doc 1. 新特性1 2. Admin login1 3. 用户注册登录2 3.1. <!-- 会员注册使用 --> ...
- Autodesk Cloud Accelerator Program 开始报名
如果你没有注意到这个消息,那你就会错过一个前往旧金山和硅谷工程师一起工作数周的机会. 摘要一下: 时间: 1月10前提交你的提案,3月飞往旧金山 地点: 旧金山. 包住宿哦~ 不过,既然要去美国,既然 ...
- [转]MOSS通过此命令注册模板,web应用程序可以根据stp模块生成网站集
注:C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\bin stsadm –o add ...
- [android]亲自破解Flappy Bird(去广告+永生)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3544785.html 听说最近Flappy Bird很火,但 ...