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