Изоляция триггера SQL Server / документация по области

Я ищу окончательно документация, касающаяся уровня изоляции (или параллелизма или области ... Я не совсем уверен, как это назвать) триггеров в SQL Server.

Я нашел следующие источники, которые указывают, что то, что я считаю истинным (то есть два пользователя, выполняющие обновления одной и той же таблицы-даже те же строки-будут иметь независимые и изолированные триггеры исполнено):

первый вопрос по существу тот же вопрос, на который я пытаюсь найти ответ, но данный ответ не предоставляет никаких источников. Второй вопрос также попадает в точку, и ответ тот же, но опять же, источники не предоставляются.

может ли кто-нибудь указать мне, где доступная документация делает те же утверждения?

спасибо!

1 ответов


Ну, уровень изоляции и сфера охвата-две очень разные вещи.

Уровень Изоляции
Триггеры работают внутри транзакции. По умолчанию эта транзакция должна использовать уровень изоляции по умолчанию READ COMMITTED. Однако если вызывающий процесс задал другой уровень изоляции, то это переопределит значение по умолчанию. Как обычно: при желании вы должны иметь возможность переопределить это в самом триггере.

по Страница MSDN для триггеры DML:

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

область
Предоставленный контекст:

{С вами}

два пользователя, выполнения обновления в той же таблице-даже те же строки

{из первой связанной статьи MSDN в вопросе ,который "по существу тот же вопрос, на который я пытаюсь найти ответ"}

представлены в таблицах inserted и deleted ограничено текущим сеансом? Другими словами, Будут ли они содержать только вставленные и удаленные записи для текущей области или будут содержать записи для всех текущих операций обновления в одной таблице? Может там даже действительно параллельные операции или блокировки предотвратят это?

прежде чем попасть в inserted и deleted таблицы следует очень четко указать, что в любой момент времени в определенной строке будет выполняться только одна операция DML. Два или более запросов могут поступать в одну и ту же наносекунду, но все запросы будут принимать свою очередь, по одному за раз (и да, из-за блокировки).

теперь о том, что в inserted и deleted таблицы: да, только строки для этого конкретного события будут (и даже can be) в этих двух псевдо-таблицах. Если вы выполните обновление, которое изменит 5 строк, только эти 5 строк будут в inserted и deleted таблицы. И поскольку вы ищете документацию, страница MSDN для использовать inserted и deleted гласит:

в удаленной таблице хранятся копии затронутых строк во время инструкций DELETE и UPDATE. Во время выполнение инструкции DELETE или UPDATE, строки удаляются из таблицы триггеров и передаются в удаленную таблицу. Удаленная таблица и таблица триггеров обычно не имеют общих строк.

в вставленной таблице хранятся копии затронутых строк во время инструкций INSERT и UPDATE. Во время транзакции вставки или обновления новые строки добавляются как во вставленную таблицу, так и в таблицу триггеров. Строки во вставленной таблице являются копиями новых строк в триггере таблица.

связывая это с другой частью вопроса, частью, относящейся к уровню изоляции транзакции: уровень изоляции транзакции абсолютно не влияет на inserted и deleted таблицы, поскольку они относятся конкретно к этому событию/запросу. Однако чистый эффект этой операции, который захватывается в этих двух таблицах psuedo, все еще может быть видимого для других процессов, если они используют READ UNCOMMITTED уровень изоляции или NOLOCK табличная подсказка.

и просто, чтобы уточнить что-то, страница MSDN, связанная выше относительно inserted и deleted таблицы в самом начале, что они "в памяти", но это не совсем верно. Начиная с SQL Server 2005, эти две псевдо-таблицы фактически основаны на tempdb. Страница MSDN для база данных tempdb база данных гласит:

на базы данных tempdb системная база данных-глобальный ресурс, доступный всем пользователям подключен к экземпляру SQL Server и используется для хранения следующие:

  • ...

  • версии строк, которые генерируются транзакциями изменения данных для функций, таких как: операции онлайн-индекса, несколько активных результирующих наборов (MARS) и триггеры AFTER.

до SQL Server 2005 inserted и deleted таблицы считывались из журнала транзакций (I верить.)


подведем итоги:inserted и deleted таблицы:

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