【发布时间】:2017-05-31 06:24:59
【问题描述】:
我正面临僵局
在锁定资源上与另一个进程死锁,并且已被 被选为死锁牺牲品。
问题在 SQL-Server 中,因为我通过针对特定列选择最大 id 在数据库中插入数据,然后添加一个增量以获得将插入记录的值。 我正在调用一个过程,如下所述:
CREATE
PROCEDURE [dbo].[Web_GetMaxColumnID]
@Col_Name nvarchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
DECLARE @MaxID BIGINT;
SET NOCOUNT ON;
-- Insert statements for procedure here
BEGIN
BEGIN TRAN
SET @MaxID = (
SELECT Col_Counter
FROM Maintenance_Counter WITH (XLOCK, ROWLOCK)
WHERE COL_NAME = @Col_Name
)
UPDATE Maintenance_Counter
SET Col_Counter = @MaxID + 1
WHERE COL_NAME = @Col_Name
COMMIT
END
SELECT (
CONVERT(
VARCHAR,
(
SELECT office_id
FROM Maintenance
)
) + '' + CONVERT(VARCHAR, (@MaxID))
) AS MaxID
END
谁能帮帮我.....
【问题讨论】:
-
发生死锁。您必须能够使您的代码不那么锁定或简单地处理它们
-
先生,我已经按照提到的代码制作了一个程序。对于插入,我只是调用那个返回值的过程,我正在插入记录。当有不同用户同时插入数据时发生死锁。如果上述存储过程需要任何更改,我需要帮助。
-
这段代码有什么意义?如果要生成数字序列,请使用 SEQUENCE。它在所有受支持的 SQL Server 版本中都可用
-
您也可以使用快照隔离代替排他锁来避免死锁,这是从 2005 年开始提供的。
-
@PanagiotisKanavos 使用快照隔离,他将生成副本,因为快照获取事务开始时的值。所以两个事务可以完美地读取 Col_Counter 的相同值。
标签: sql-server sql-server-2014