2013-06-28 2 views
2

Предположим, у меня есть таблица, и я установил триггер after update, который обновляет столбец в той же измененной строке.SQL-сервер и триггер отражают изменения порядка?

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

Пример:

есть триггер для обновления, который устанавливает "IsNameSet" к 1 (при name модифицируется)

update myTable set name="a" where id={...}

, а затем немедленно

select IsNameSet from myTable where id=...{modified row id}

(!)

Гарантирует ли я, что я способы см. 1?

ответ

2

Если SELECT происходит до совершения транзакции UPDATE (включая триггер), то это зависит от уровня изоляции транзакции чтения.

При чтении не указано, оно может читать name="a" and IsNameSet = 0.

Если моментальный снимок, он может считывать значение предварительной версии строки. В противном случае он будет заблокирован, прочитав строку до тех пор, пока транзакция UPDATE не будет зафиксирована и будет читать значение «после».

В зависимости от точного требования, возможно, что-то вычисленное столбец могло бы работать более эффективно, чем триггер.

+0

Итак, вы говорите, чтобы установить столбец 'IsNameSet' как вычисленный столбец? но разве это не зависит от уровня изоляции? –

+0

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

+0

Что вы подразумеваете под «Просто по причине эффективности» (извините, не знаете, что это значит). это ответ на вопрос: «Разве это не зависит от уровня изоляции»? –