Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

DeadLockи (tablock, serializable)

$
0
0
Установлен Microsoft SQL Server 2014 - 12.0.2370.0 (X64).
Установили новое ПО от поставщика, сами не разрабатывем.
В день получаем кучу deadlock от хранимой процедуры. Официальный ответ от поставщика, запросы выполнять последовательно, а не параллельно. Звучит смешно паралелльные вычисления сделать последовательными. После анализа заметили откуда растут блоки.
Есть хранимая процедура, которая ставит блок на всю таблицу. Когда приходит несколько парралельных процессов, бывают случаи, что процесс 1 блокирует процесс 2, а процесс 2 блокирует процесс 1.
Обращаюсь к гуру, можно ли как то это исправить. Текст хранимки ниже, возможно у нее стоят неверные типы блокировок. Но для это звучит смешно, что в мире параллельных вычисление MSSQL не может разрулить их. Суть хранимки, при получении запроса от клиента, записывать значения в таблицу.

USE UPSLT
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER procedure TS_LOCK_PROCESS_LOCK
        @lockType int,
        @lockKey nvarchar(128),
        @accessMode nchar,
        @lockLifeSpan int,
        @hostName nvarchar(32),
        @moduleName nvarchar(65),
        @methodName nvarchar(128),
        @lockOwner nvarchar(12),
		@curWriteLockOwner nvarchar(12) output
as
begin
    delete from TSDBA.TS_PROCESS_LOCK where EXPIRATION_TIME < GETUTCDATE()

    declare @result int
    set @result = 0
    begin tran
        select @result=-count(1) from TSDBA.TS_PROCESS_LOCK with (tablock, serializable) 
            where LOCK_TYPE = @lockType and LOCK_KEY = @lockKey and (@accessMode = 'W' or ACCESS_MODE = 'W')
        if (@result = 0)
        begin
		    declare @utcNow datetime
			set @utcNow = GETUTCDATE()
		    declare @expTime datetime
		    set @expTime = DATEADD(s, @lockLifeSpan, @utcNow)
            insert into TSDBA.TS_PROCESS_LOCK
                (LOCK_TYPE, LOCK_KEY, ACCESS_MODE, LOCK_TIME, EXPIRATION_TIME, HOST_NAME, MODULE_NAME, METHOD_NAME, LOCK_OWNER) values
                (@lockType, @lockKey, @accessMode, @utcNow,   @expTime,        @hostName, @moduleName, @methodName, @lockOwner)
            set @result = @@identity
        end
		else
		   select @curWriteLockOwner=LOCK_OWNER from TSDBA.TS_PROCESS_LOCK where LOCK_TYPE = @lockType and LOCK_KEY = @lockKey and ACCESS_MODE = 'W'
    commit tran
	
    return @result
end

Viewing all articles
Browse latest Browse all 7251