詳解SQL死鎖檢測(cè)的方法
sql server中的死鎖是指進(jìn)程之間互相永久阻塞的狀態(tài),下文就將為您介紹如何檢測(cè)sql server死鎖,希望對(duì)您有所幫助。
死鎖(deadlock)指進(jìn)程之間互相永久阻塞的狀態(tài),SQL可以檢測(cè)到死鎖,并選擇終止其中一個(gè)事務(wù)以干預(yù)sql server死鎖狀態(tài)。
第一步:首先創(chuàng)建兩個(gè)測(cè)試表,表goods_sort和goods
表goods_sort:創(chuàng)建并寫入測(cè)試數(shù)據(jù)
IF EXISTS(SELECT name FROM sysobjects WHERE name='goods_sort' AND xtype='U') DROP TABLE dbo.goods_sort --創(chuàng)建商品分類表 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:創(chuàng)建并寫入測(cè)試數(shù)據(jù)
IF EXISTS(SELECT name FROM sysobjects WHERE name='goods' AND xtype='U') DROP TABLE dbo.goods; --創(chuàng)建商品表 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
第二步:創(chuàng)建兩個(gè)會(huì)產(chǎn)生死鎖的事務(wù)
事務(wù)1:
SET NOCOUNT ON; SET XACT_ABORT ON; GO --使用TRY-CATCH,使代碼發(fā)生錯(cuò)誤也繼續(xù)運(yùn)行 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則表示發(fā)生了死鎖 IF (ERROR_NUMBER() = 1205) PRINT '事務(wù)1發(fā)生了死鎖' --寫SQL Server日志或者返回錯(cuò)誤給應(yīng)用程序 END CATCH SELECT iID,sGoodsName FROM dbo.goods WHERE iID=2; SELECT iSortID,sSortName FROM dbo.goods_sort WHERE iSortID=1003; GO
事務(wù)2:
SET NOCOUNT ON; SET XACT_ABORT ON; GO --使用TRY-CATCH,使代碼發(fā)生錯(cuò)誤也繼續(xù)運(yùn)行 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則表示發(fā)生了死鎖 IF (ERROR_NUMBER() = 1205) PRINT '事務(wù)2發(fā)生了死鎖' --寫SQL Server日志或者返回錯(cuò)誤給應(yīng)用程序 END CATCH SELECT iID,sGoodsName FROM dbo.goods WHERE iID=2; SELECT iSortID,sSortName FROM dbo.goods_sort WHERE iSortID=1003; GO
然后運(yùn)行事務(wù)1,接著馬上運(yùn)行事務(wù)2,這種情況下某一個(gè)事務(wù)會(huì)提示發(fā)生了死鎖,修改不成功。另外一個(gè)事務(wù)則完成。
第一點(diǎn):使用TRY.CATCH讓產(chǎn)生異常的事務(wù)能繼續(xù)完成后面的代碼。
第二點(diǎn):使用WAITFOR DELAY產(chǎn)生造成死鎖的發(fā)生環(huán)境。
第三點(diǎn):使用ERROR_NUMBER()來(lái)判斷是否發(fā)生事務(wù)。
第四點(diǎn):發(fā)生死鎖,寫SQL Server日志或者返回應(yīng)用程序去寫日志。便于檢查日志的時(shí)候發(fā)現(xiàn)存在死鎖并做相應(yīng)的修改。
以上內(nèi)容給大家介紹了SQL死鎖檢測(cè)的方法,希望大家喜歡。
相關(guān)文章
SQL語(yǔ)言查詢基礎(chǔ):連接查詢 聯(lián)合查詢 代碼
SQL語(yǔ)言查詢基礎(chǔ):連接查詢 聯(lián)合查詢 代碼...2007-03-03基于SQL Server中char,nchar,varchar,nvarchar的使用區(qū)別
對(duì)于程序中的一般字符串類型的字段,SQL Server中有char、varchar、nchar、nvarchar四種類型來(lái)對(duì)應(yīng),那么這四種類型有什么區(qū)別呢,這里做一下對(duì)比2013-05-05Sql Server中Substring函數(shù)的用法實(shí)例解析
在sqlserver中substring函數(shù)是用來(lái)處理字符串的,常用于字符串截取了,下面我來(lái)給大家介紹下Sql Server中Substring函數(shù)的用法實(shí)例解析,需要的朋友參考下吧2016-12-12SQL Server誤區(qū)30日談 第19天 Truncate表的操作不會(huì)被記錄到日志
這個(gè)誤區(qū)也同樣流傳已久,我想是時(shí)候通過(guò)一些Demo進(jìn)行揭穿了2013-01-01SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié)
SQL Server2016 CTP2.2是微軟數(shù)據(jù)平臺(tái)歷史上邁出最大的一步,更快的事務(wù)處理和查詢、任何設(shè)備更深入的洞察力、更先進(jìn)的分析能力、全新安全技術(shù)和全新的混合云場(chǎng)景,本文給大家介紹SQL Server 2016 CTP2.3 的關(guān)鍵特性總結(jié),需要的朋友可以參考下2015-09-09sql server 2012 數(shù)據(jù)庫(kù)所有表里查找某字符串的方法
此TSQL語(yǔ)句是針對(duì)SQL Server 2012編寫。如果使用之前版本,需要對(duì)部分語(yǔ)句進(jìn)行重寫。2013-03-03sql 語(yǔ)句 取數(shù)據(jù)庫(kù)服務(wù)器上所有數(shù)據(jù)庫(kù)的名字
sql 語(yǔ)句 取數(shù)據(jù)庫(kù)服務(wù)器上所有數(shù)據(jù)庫(kù)的名字,一般作者自己是沒(méi)問(wèn)題了。2009-02-02MSSQL MySQL 數(shù)據(jù)庫(kù)分頁(yè)(存儲(chǔ)過(guò)程)
有關(guān)分頁(yè) SQL 的資料很多,有的使用存儲(chǔ)過(guò)程,有的使用游標(biāo)。本人不喜歡使用游標(biāo),我覺(jué)得它耗資、效率低;使用存儲(chǔ)過(guò)程是個(gè)不錯(cuò)的選擇,因?yàn)榇鎯?chǔ)過(guò)程是經(jīng)過(guò)預(yù)編譯的,執(zhí)行效率高,也更靈活2012-01-01