Изоляция триггера 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
таблицы:
- работать в рамках транзакции
- статичные (т. е. только для чтения) таблиц
- видны только текущему триггеру
- содержат только строки для конкретного события / операции / запроса, который запустил этот экземпляр этого триггера