2013-05-29 2 views
0

Из-за повторяющихся тупиков, вызванных временной большой нагрузкой (около 10 секунд), я хотел изменить уровень изоляции нашей формы базы данных READ_COMMITED на READ_COMMITED_SNAPSHOT.SQL Server READ_COMMITED_SNAPSHOT внутри триггера

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

Есть 2 возможности здесь (при условии, что есть строки с более низкими идентификаторами присутствуют) и предполагая, эти 2 строк находятся внутри триггера на каком-либо другом

1)

Insert into table (ID) value (3); 
Select Top 1 ID from table order by ID desc; 

2)

Insert into table (ID) value (3); 
Select SCOPE_IDENTITY(); 

В теории это должно быть хорошо, но Id'd, как подтверждение. Спасибо

+1

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

+0

Мне тоже хотелось бы, к сожалению, это (по крайней мере, для моих способностей) невозможно из-за большого количества данных, которые можно разделить на несколько таблиц при вставке одной строки в определенную таблицу. Генерация объединяет несколько других таблиц для генерации желаемых данных. – LuigiEdlCarno

+0

Как получить тупиковый график? O_o – Serge

ответ

2

Используйте Scope_Identity() или OUTPUT, чтобы получить идентификатор, присвоенный новым строкам. Они не страдают от условий гонки, которые разрешает SELECT. Уровень изоляции не должен представлять проблемы.

OUTPUT - это хорошая вещь, чтобы иметь в сумке инструменты по разным причинам. Он работает для INSERT, DELETE, UPDATE и MERGE заявления. Это не ограничивается одной строкой. Это позволяет захватывать несколько столбцов, а не только значение идентификатора.

Не используйте @@IDENTITY, так как он получает значения с темной стороны. (Если вам не нужен источник непредсказуемых значений.) IDENT_CURRENT() также редко бывает полезным.

+0

Хотя в моем inserttrigger уже есть «вставленная» таблица, как я могу «вывести»? Разве это не конфликтует с существующей таблицей «вставлен»? – LuigiEdlCarno

+0

@LuigiEdlCarno - таблицы «вставлены» и «удалены» ([Ref] (http://msdn.microsoft.com/en-us/library/ms191300.aspx).) Отражают действие оператора, вызвавшего триггер стрелять.Предложение 'OUTPUT' в инструкции позволяет явно направлять столбцы по вашему выбору _ из содержащего оператора_ в таблицу. Конфликтов нет. – HABO

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