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

Откуда:
Сообщений: 40
Добрый день, знатоки.

Нужна ваша помощь. Не судите строго если вопросы покажутся вам глупыми.

Имеется таблица в которую пишется около 15 записей в секунду. После инсерта срабатывает триггер, который вызывает процедуру в которую передает параметры, в ней производятся расчеты и запись в другую таблицу.

Проблема в том, что пока выполняются расчеты в процедуре и пока не отработает триггер запись в первую таблицу не происходит. Т.е. либо триггер, либо процедура блокируют таблицу на время выполнения. При этом мощности сервера не используются по максимуму, просто идет ожидание завершения отработки триггера. В результате создается очередь этих записей в первую таблицу.

Нет ли какого то способа отправлять данные в процедуру не ожидая ее завершения и тем самым не создавая очередь для записываемых данных?
24 мар 16, 13:33    [18972895]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
semI-PACK
Проблема в том, что пока выполняются расчеты в процедуре и пока не отработает триггер запись в первую таблицу не происходит.

Происходит. Просто это еще грязные данные. Которые по-умолчанию не видны

semI-PACK
Т.е. либо триггер, либо процедура блокируют таблицу на время выполнения.

Триггер(и все, что он вызовет) - это часть транзакции. И разумеется пока выполняется триггер(и все что вызвал) все блокровки транзакции существуют. Это - нормально.

semI-PACK
Нет ли какого то способа отправлять данные в процедуру не ожидая ее завершения и тем самым не создавая очередь для записываемых данных?

Не вызывайте процедуру в триггере. Особенно если вам в триггере не нужны результаты работы этой процедуры.
24 мар 16, 13:38    [18972932]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4176
semI-PACK
Добрый день, знатоки.

Нужна ваша помощь. Не судите строго если вопросы покажутся вам глупыми.

Имеется таблица в которую пишется около 15 записей в секунду. После инсерта срабатывает триггер, который вызывает процедуру в которую передает параметры, в ней производятся расчеты и запись в другую таблицу.

Проблема в том, что пока выполняются расчеты в процедуре и пока не отработает триггер запись в первую таблицу не происходит. Т.е. либо триггер, либо процедура блокируют таблицу на время выполнения. При этом мощности сервера не используются по максимуму, просто идет ожидание завершения отработки триггера. В результате создается очередь этих записей в первую таблицу.

Нет ли какого то способа отправлять данные в процедуру не ожидая ее завершения и тем самым не создавая очередь для записываемых данных?


Вы можете отправлять сообщения в очередь для обработки Service Broker, вместо вызова процедуры и обработки в ней.
В этом случае будет асинхронная обработка, но надо следить за случаями, когда основная транзакция откатится
24 мар 16, 13:41    [18972953]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
semI-PACK
Member

Откуда:
Сообщений: 40
Glory
Не вызывайте процедуру в триггере. Особенно если вам в триггере не нужны результаты работы этой процедуры.


Как же быть если нужно, чтобы после добавления все записи были определенным образом обработаны, но при этом не создавалась очередь у добавляемых записей?
24 мар 16, 13:42    [18972960]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
semI-PACK
Как же быть если нужно, чтобы после добавления все записи были определенным образом обработаны, но при этом не создавалась очередь у добавляемых записей?

Обрабатывайте записи в другом процессе/соединении/приложении.
24 мар 16, 13:44    [18972978]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
semI-PACK
Member

Откуда:
Сообщений: 40
Glory
Обрабатывайте записи в другом процессе/соединении/приложении.


Т.е. при вызове процедуры из триггера он в любом случае будет дожидаться завершения выполнения процедуры? Отправить параметры в процедуру и оставить выполняться эту задачу в фоновом режиме нельзя?
24 мар 16, 14:01    [18973159]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
Glory
Member

Откуда:
Сообщений: 104751
semI-PACK
Т.е. при вызове процедуры из триггера он в любом случае будет дожидаться завершения выполнения процедуры? Отправить параметры в процедуру и оставить выполняться эту задачу в фоновом режиме нельзя?

Да. Транзакция - либо вся завершается, либо вся отменяется.
И команды execute в фоновом режиме не бывает.
24 мар 16, 14:04    [18973192]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
А почему нельзя в процедуре выполнить действия после добавления данных в таблицу? Триггер-то здесь зачем?
24 мар 16, 14:58    [18973577]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
хе-хе )
Guest
1. на свой страх и риск коммитить транзакцию в триггере
2. Про асинхронную обработку брокером уже сказали (там процедура активации используется)
24 мар 16, 18:22    [18974866]     Ответить | Цитировать Сообщить модератору
 Re: Блокирование таблицы триггером  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
semI-PACK
Как же быть если нужно, чтобы после добавления все записи были определенным образом обработаны, но при этом не создавалась очередь у добавляемых записей?
Вам же нужно, что бы "после добавления все записи были определенным образом обработаны", то есть они не должны быть доступны, пока не обработаны, иначе будет какая то несогласованность данных?

Если несогласованности не будет, то можно вызывать процедуру после вставки записей, не в триггере. Можно даже сразу для множества данных, которые были вставлены до этого (например, по расписанию).

А если несогласованность будет, то блокирование неизбежно, и единственный выход - это ускорить выполнение процедуры.
24 мар 16, 20:52    [18975231]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить