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

Откуда:
Сообщений: 496
Собственно вопрос. Предположим, есть триггер, повешенный на вставку записи в некую таблицу. После того, как запись была вставлена и триггер начал выполняться, блокировка с этой таблицы снимается?
16 май 12, 17:34    [12564926]     Ответить | Цитировать Сообщить модератору
 Re: Триггер лочит таблицу, на которой он висит?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Триггер выполняется в той же транзакции, что и модификация данных, его вызвавшая.
И да, блокировки бывают не только на таблицу.
16 май 12, 17:36    [12564944]     Ответить | Цитировать Сообщить модератору
 Re: Триггер лочит таблицу, на которой он висит?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Локировки бывают и на строки и на страницы, и на запрет изменения и на "запрет" чтения, и на запрет изменения структуры таблицы.
Локировки могут длиться или на микро-момент работы или на "главную" явную транзакцию, в зависимости от типа.
В зависимости от уровня изоляции транзакций SELECT-ы могут накладывать или на операцию (неявная транзакция) или на явную транзакцию. Модификация это монопольные локировки, сохраняются до самого конца явной "главной"/"самой внешней" транзакции и не зависят от уровня изоляции (в случае снапов, всё по другому).

Триггер работает внутри неявной транзакции оператора изменения таблицы.
Триггера бывают AFTER (после внесения изменений) и INSTEAD OF (вместо изменений, т.е. тупо запрос).
Т.е. в случае AFTER на данных висят монопольные локировки, в случае INSTEAD OF локировки чтения.

В случае READ COMMITED локировки чтения не привязаны к транзакции и сразу снимаются, поэтому в INSTEAD OF триггере данные могут быть уже не актуальны. В AFTER монопольность локировки снимает всякий смысл о снятии локировок, они могут продолжатся накладываться и после завершения операции.

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

Для каждый таблы в запросе может быть свой (указанный) уровень изоляции и накладывания локировок.

PS: Когда я говорил про монопольность, то я имел ввиду эксклюзивность, а не X локировку. Т.е. захват до самого конца, без какого либо дальнейшей мутации и "чтения". Да, лучше перефразировать.
Естественно я опустил момент про грязное чтение.
Всё для простоты понимания новичком.
PPS: "На операцию" тоже говорить нельзя, т.к. локировка может висеть не на всё время её выполнения. Т.е. привязана к транзакции или не привязана.
17 май 12, 00:54    [12566729]     Ответить | Цитировать Сообщить модератору
 Re: Триггер лочит таблицу, на которой он висит?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
Поэтому нет смысла говорить об моментах начала и конца триггеров
Для каждый таблы в запросе может быть свой (указанный) уровень изоляции и накладывания локировок.
Или есть?
17 май 12, 00:57    [12566735]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить