Обновление SQL через триггеры без блокировки базы данных - PullRequest
0 голосов
/ 04 февраля 2011

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

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

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

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

1 Ответ

0 голосов
/ 04 февраля 2011

Невозможно создать действие, которое, по крайней мере, не устанавливает блокировку записи для записи / страницы, на которую производится запись.В противном случае SQL Server будет постоянно иметь проблемы с согласованностью.Вы должны смотреть с противоположной стороны - другие процессы, которым необходим доступ к таблице аудита (аудит обычно означает чтение только с минимальным обновлением или без обновления), должны использовать

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
or
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

, который будет «грязным» (или версионным)без блокировки) из таблицы аудита

Если вам необходимо ..
Существует хитрый способ изолировать запись от транзакции с использованием компонента Service Broker, вместо этого вставляя данные в промежуточную таблицуи наличие потока асинхронной активации SSSB напишет для вас запись аудита, позволяя вашей исходной долгосрочной транзакции остаться незафиксированной.

...