Мне было интересно узнать о семантике параллелизма в отношении триггеров базы данных 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, будет оценено по достоинству. Благодаря!
отчетливое ничего не делает в лучшем случае и потенциально не приводит к потере производительности. – usr