使用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死锁和阻塞的 ...
随机推荐
- volcanol_Linux_ 问题汇总系列_4_Thinkpad_E40_0578MDC_在Fedora 13 Linux(FC13)中如何安装无线网卡驱动
今天晚上,我突然想在自己到笔记本上安装linux系统,因为我自己第一次接触到的linux是红帽支持到Fedora Core 4,所以一直最中意的linux 发行版本是FC系列,同时由于FC 15以后到 ...
- Scalaz(3)- 基础篇:函数概括化-Generalizing Functions
Scalaz是个通用的函数式编程组件库.它提供的类型.函数组件都必须具有高度的概括性才能同时支持不同数据类型的操作.可以说,scalaz提供了一整套所有编程人员都需要的具有高度概括性的通用函数,它是通 ...
- svn利用钩子实现代码同步到web目录
思路: 找 到SVN Server中的仓库(Repositories)文件夹的位置,在相应的项目文件夹中找到hooks文件夹.在该文件夹中添加一个post- commit文件:当有commit动作发 ...
- Java 经典实例:自定义迭代器
编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用"foreach"循环遍历你的对象. import java.util.Itera ...
- C#语言的基础
一.C#的引入 01..net和C#的区别 1)大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标:任何人,在任何地方,使用任何终端设备,都可以访问微软提供的服务. 2).net ...
- NotSerializableException解决方法
NotSerializableException 问题描述: 想要写入对象的时候的时候回抛出NotSerializableException:类名 原因: 写入的对象没有序列化,即没有实现java.i ...
- PHP极客水平测试——给创业公司用的远程面试题
出了份面试题<PHP极客水平测试>,创业公司可以用这个远程笔试啦,先答题,看答案合适了再邀请面试.希望对创业公司有所帮助,欢迎围观提建议哦^_^ 题目会持续更新. 答题地址:http:// ...
- Oracle EBS Form 发布到Server端的注意事项
前段时间在本地XP系统上测试了一些整合javabean的Form例子,想着发布到服务器段去看看能否运行正常,一开始以为会和本地XP系统一样,部署到相关的目录下进行一些配置就可以了,但实际过程却和想象的 ...
- JS高程2.在HTML中使用Javascript(1)
1.使用<script>元素向HTML页面中插入Javascript HTML4.01中<script>标签有6个属性: (1)async:可选.表示立即下载脚本,不影响页面中 ...
- jQuery实用小技巧-获取选中的的下拉框和返回头部滑动动画
//获取选中的下拉框 $('#someElement').find('option:selected'); $('#someElement option:selected'); //返回头部滑动动画 ...