- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到以下存储过程的间歇性死锁。它每分钟运行一次。它已经投入生产超过 1 年,我们通常不会收到此错误,但它有时会突然出现......在我们的一个环境中每天抛出 3 到 5 次异常......它与其他实例的环境相同没有抛出错误。存储过程被制作成一次只能运行一次,但也许我们这样做的方式不正确?
这里是错误:
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Data.SqlClient.SqlException: Transaction (Process ID 60) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
存储过程如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[requestUpdate]
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
DECLARE @StartDate datetime,
@EndDate datetime,
@Throttle bit,
@Expired bit
SELECT @Throttle = 0
SELECT @Expired = 0
SELECT TOP 1 @StartDate = uq.StartDate, @EndDate = uq.EndDate
FROM UpdateQueue uq WITH(TABLOCK,XLOCK)
ORDER BY ID DESC
-- PREVENT ANOTHER REQUEST IF THIS SP HAS BEEN
-- CALLED IN THE LAST FORTY SECONDS.
IF DATEADD(SECOND,-40,GETDATE()) < @StartDate
BEGIN
SELECT @Throttle = 1
END
-- CREATE ANOTHER REQUEST IF THE CURRENT ONE
-- HAS NOT COMPLETED IN THE LAST FIVE MINUTES.
IF @StartDate <= DATEADD(MINUTE,-5,GETDATE())
BEGIN
SELECT @Expired = 1
END
-- HAS THE CURRENT REQUEST EXPIRED?
IF @EndDate IS NULL AND @Expired = 1
BEGIN
INSERT INTO UpdateQueue (RequestID, StartDate) OUTPUT 'EXPIRED' AS Result, INSERTED.RequestID AS RequestID
VALUES (NEWID(), GETDATE())
END
-- HAS THE CURRENT REQUEST COMPLETED AND YOU ARE NOT THROTTLING
-- OR HAVE THERE NOT BEEN ANY REQUESTS YET?
ELSE IF (@EndDate IS NOT NULL AND @Throttle = 0) OR @StartDate IS NULL
BEGIN
INSERT INTO UpdateQueue (RequestID, StartDate) OUTPUT 'STARTED' AS Result, INSERTED.RequestID AS RequestID
VALUES (NEWID(), GETDATE())
END
-- Running
ELSE
BEGIN
SELECT 'RUNNING' AS Result, NULL AS RequestID
END
COMMIT
最佳答案
我怀疑这是某个特定锁的持有时间超过了您的连接愿意等待的时间。如果没有什么可以终止长时间运行的事务,在这里,您将遇到这种情况,因为当连接超时时,SQL Server 会强制等待结束并终止作为死锁受害者的传入锁。
长话短说:一些进程(不是这里详述的)正在锁定表,导致死锁。
检查当您遇到死锁时还发生了什么 - 是否有备份正在运行,或者其他什么东西锁定了这个表?
关于sql - 使用 TABLOCK、XLOCK 命令在 Microsoft SQL Server 2008 上出现间歇性死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12900038/
我看到 (xlock,rowlock,holdlock) 的组合用于表。引用网上书,holdlock是持有共享锁(读,如select)直到事务完成,xlock是排他锁(写锁),用于数据修改,如更新、插
考虑一下这个简单的表格: 建表语句是: CREATE TABLE [dbo].[Test_Serializable]( [Id] [int] NOT NULL, [Name] [nvarchar](5
在 SQL Server 2008 中,我知道没有嵌套事务这样的东西。这些似乎只是存在。我也知道一些专家强烈恳请开发人员不要使用可用的伪嵌套事务。例如,here . 但是,我有一个案例,我需要在特定嵌
从我最近所做的一些测试和阅读来看,XLOCK 的“X”(独占)名称部分似乎具有误导性。事实上,它并不比 UPDLOCK 多加锁。如果它是独占的,它将阻止外部 SELECT,但事实并非如此。 我无法从阅
在数据库中 begin tran select * from foos with (rowlock, xlock, holdlock) where id =7 ... commit tran
我遇到以下存储过程的间歇性死锁。它每分钟运行一次。它已经投入生产超过 1 年,我们通常不会收到此错误,但它有时会突然出现......在我们的一个环境中每天抛出 3 到 5 次异常......它与其他实
我正在尝试对行进行选择并更新值。当我这样做时,我需要对该行的独占访问权限。换句话说,在我更新该行之前,任何其他进程(虚拟机内部或外部)都应该能够读取该行。当前值不应该是“可选择的”。我尝试过以下事务注
我有两个外键关系的表,像这样: CREATE TABLE table_a ( id int IDENTITY(1,1) NOT NULL PRIMARY KEY ) CREATE TABLE
我是一名优秀的程序员,十分优秀!