2014-12-17 2 views
5

Мне было интересно узнать о семантике параллелизма в отношении триггеров базы данных SQL Server. У меня есть триггер базы данных, который запускается после обновления таблицы. Триггер устанавливает столбец «dateModified» в текущее время. Это позволяет мне всегда знать, что последнее обновление таблицы произошло в X раз. Ниже то, что это будет выглядеть так:SQL-база данных запускает потоки безопасности?

ALTER TRIGGER base.TR_myTrigger ON base.myTable 
    AFTER INSERT, UPDATE AS 
BEGIN 
    DECLARE @dateModified AS DATETIMEOFFSET 

    SET @dateModified = SYSDATETIMEOFFSET() 
    UPDATE base.myTable 
    Set dateModified = @dateModified 
    WHERE id in (SELECT DISTINCT(id) FROM inserted) 
END 

В моем сценарии, таблица может быть обновлена ​​в любое время любого количества потоков. Является ли этот триггер безопасным в многопоточном контексте? Если поток A обновляет таблицу, а поток B сразу считывает ее, B будет видеть состояние таблицы с обновлениями A, но не обновлениями триггера тоже? Или триггеры защищают таблицу от чтения до тех пор, пока не будут выполнены все действия + их триггеры?

Любое понимание того, что именно происходит под капотом с помощью триггеров базы данных SQL, будет оценено по достоинству. Благодаря!

+0

отчетливое ничего не делает в лучшем случае и потенциально не приводит к потере производительности. – usr

ответ

2

Если поток A обновляет таблицу, а поток B считывается из нее сразу после этого, B будет видеть состояние таблицы с обновлениями A, но не обновлениями триггера тоже? Или триггеры защищают таблицу от чтения до тех пор, пока не будут выполнены все действия + их триггеры?

Что это за сведение к нулю: это основная операция и операция триггера, рассматриваемая как атомная единица или они разделены? Ответ: атомный. То есть вы никогда не увидите результаты вставки или обновления (в вашем случае) и не увидите столбец dateModified, с которым можно связаться с помощью триггера. То есть, они оба совершают транзакции. От the documentation:

Триггер и утверждение, что пожары это рассматривают как одну транзакцию ...

+0

Отлично, спасибо! Именно эту информацию я искал. – Ryan

0

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

Ваш триггер безопасен, потому что все строки, которые вы читали и записывали, были уже заблокированы X с помощью запускающего DML.

Смежные вопросы