2015-02-17 1 views
6

Я искал окончательный документацию относительно уровня изоляции (или параллелизма или области действия ... Я не уверен, ТОЧНО, что называть это) триггеров в SQL Server.Документация по изоляции триггера SQL Server

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

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

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

Спасибо!

+0

Да. 1 пользователь не сможет одновременно видеть данные от второго пользователя. Ну, конечно, предполагается, что триггер не использует read uncommitted или nolock. Это просто доказать самому себе. Создайте таблицу с триггером. Затем откройте 1 вкладку в SSMS и начните транзакцию и выполните вставку. Не совершайте транзакцию и делайте то же самое на второй вкладке. Вторая вкладка не может видеть незафиксированные данные из вкладки 1. –

+0

Я не уверен, что вы найдете какую-либо официальную документацию, которая конкретно укажет это в том виде, который вы хотите. Но довольно легко представить себе, как хаотическое развитие триггеров было бы, если бы это было не так. –

+0

@Damien_The_Unbeliever Есть некоторые официальные документы, с которыми я связан, которые дают кусочки этого. –

ответ

7

Ну, уровень изоляции и область действия - это две разные вещи.

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

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

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

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

{от вас}

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

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

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

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

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

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

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

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

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

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

  • ......

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

До SQL Server 2005, то inserted и deleted столы были считаны из журнала операций (я считаю).


В итоге, inserted и deleted столы:

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

wow .... подробный ответ! Спасибо за это! – reidLinden