Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 определение блокировки строк заранее  [new]
valv
Member

Откуда:
Сообщений: 122
есть процедура, которая удаляет строки, такого примерно вида:
CREATE PROCEDURE del_obj 
	@ObjectId int
AS
begin try
begin tran
	delete from tbObjectsDetails1 where ObjectId = @ObjectId
	delete from tbObjectsDetails2 where ObjectId = @ObjectId
	delete from tbObjectsDetails3 where ObjectId = @ObjectId
	delete from tbObjects where id = @ObjectId
commit
end try
begin catch ... end catch

обычно работает несколько милисекунд, но иногда выпадает в exception по таймауту 10 минут.
причина: в одной из таблиц строки, которые надо удалить, оказываются под блокировкой, несовместимой с удалением.
1. возможно ли добавить в процедуру такую проверку:
если есть блокировка на удаляемую строку не ждать 10 минут, а сразу вернуть сообщение типа "нельзя удалить объект из за блокировки типа IS на таблице tbObjectsDetails2 из сессии spid = 123"?
2. и возможна ли ещё лучшая проверка: не сразу прерываться из-за блокировки, а 5 секунд пытаться удалить строку и только потом прерываться?
MS SQL 2008R2
спасибо
9 апр 13, 21:23    [14159005]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
BOL->SET LOCK_TIMEOUT
9 апр 13, 21:34    [14159031]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
valv
Member

Откуда:
Сообщений: 122
pkarklin
BOL->SET LOCK_TIMEOUT

это не проблема выставить 5-секундный таймаут, обломиться с удалением и на этом завершить.
задача _заранее_ определить, что строка не может быть удалена из-за блокировки, и найти блокирующий процесс.
9 апр 13, 21:45    [14159044]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
valv
задача _заранее_ определить, что строка не может быть удалена из-за блокировки, и найти блокирующий процесс.


BOL->sys.dm_tran_locks
9 апр 13, 21:49    [14159054]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
valv
pkarklin
BOL->SET LOCK_TIMEOUT

это не проблема выставить 5-секундный таймаут, обломиться с удалением и на этом завершить.
задача _заранее_ определить, что строка не может быть удалена из-за блокировки, и найти блокирующий процесс.
Найти блокирующий процесс проще всего из приложения. Поставить таймер перед запросом и через 5 секунд посмотреть, кто держит ваш процесс.
pkarklin
BOL->sys.dm_tran_locks
ИМХО слишком сложно анализировать...
9 апр 13, 22:35    [14159140]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
alexeyvg
ИМХО слишком сложно анализировать...


Правильно! Но ТС ведь нужны были детали...
9 апр 13, 22:37    [14159144]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
valv
pkarklin
BOL->SET LOCK_TIMEOUT

это не проблема выставить 5-секундный таймаут, обломиться с удалением и на этом завершить.
задача _заранее_ определить, что строка не может быть удалена из-за блокировки, и найти блокирующий процесс.
И что с ним делать, с процессом этим?

И ничего, что между "определили, что ничего не заблокировано" и "начали спокойно удалять" запросто может влезть блокирующий процесс?

Вы уверены, что не велосипед изобретаете?
9 апр 13, 22:53    [14159175]     Ответить | Цитировать Сообщить модератору
 Re: определение блокировки строк заранее  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
valv,

У вас подход не совсем правильный, вам нужно вылечить проблему а не бороться с ней.

1. Проверьте существование индексов по ObjectId на таблицах.
tbObjectsDetails1
tbObjectsDetails2
tbObjectsDetails3
tbObjects

2. Найдите запросы которые блокируют таблицу на долгое время, это какой-то долгоиграющий апдейт, оптимизируйте его, посмотрите на наличие необходимых индексов, возможно стоит делать апдейт не всех записей сразу а пачками.
9 апр 13, 23:00    [14159182]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить