程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> 詳解SQL逝世鎖檢測的辦法

詳解SQL逝世鎖檢測的辦法

編輯:MSSQL

詳解SQL逝世鎖檢測的辦法。本站提示廣大學習愛好者:(詳解SQL逝世鎖檢測的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解SQL逝世鎖檢測的辦法正文


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逝世鎖檢測的辦法,願望年夜家愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved