UPDATE = DELETE (помечено как) + INSERT?

Это вопрос SQL Server, но я был бы признателен за правильность определения ответов на другие контексты СУБД.

Ответ Seth Lynch на мой вопрос в форуме MSDN:

говорит:

"Когда данные обновляются, они не написаны - исходная строка помечена как удаленная и вставлена ​​новая строка"

Правильно ли это утверждение? Можете ли вы дать ссылки, подтверждающие это в документах?
Как это можно проверить?

Связанные дискуссиях:

Обновление: Не так давно я считал, что грязные чтения разрешены в READ UNCOMMITTED уровне изоляции транзакций (или, что то же самое в SQL Server, с помощью подсказки WITH (NOLOCK)) разрешено чтение (из других транзакций) незафиксированных (или совершенных, если они еще не изменены), но не частично изменены (частично обновлены, частично удалены или частично вставлены.

RESUME ': коротко говоря, эта фраза, как правило, и в большинстве случаев неверна (хотя она категорически заявляет об довольно необычных случаях в SQL Server)

Ответ 1

По словам Калена Делани, в ее книге "Внутренний Microsoft SQL Server 2005: механизм хранения" SQL Server 2005 (и теперь 2008) может обновлять строку с помощью вставки/удаления или на месте, просто изменив значение одного столбца, Здесь краткое изложение того, что она говорит на стр. 306-311 книги.

Нормальное поведение в SQL Server 2005/2008 заключается в обновлении строки на месте. Строка остается в том же месте на странице, и изменены только затронутые байты. Примером этого может быть обновление значения в целочисленном столбце, который не является частью заглавного индекса.

Строка может обновляться с помощью вставки/удаления, когда размер изменяется и больше не подходит на исходной странице. Это может произойти, если вы измените значение в столбце varchar и сделаете его более длинным. Это также происходит, когда кластерный индексный столбец изменяется, и строка должна двигаться из-за своей позиции в индексе (поскольку строки упорядочены кластеризованным ключом). Примером этого может быть изменение имени человека от "Смит" до "Джонса" в таблице с кластеризованным индексом по имени.

Ответ 2

Это зависит от реализации.

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

В режиме блокировки на основе concurrency строка может быть изменена на месте, так как только одна транзакция может читать и записывать строку.

Детали зависят от реализации. Некоторые системы будут использовать дельта до фиксации, а некоторые будут изменять строку, но сохранить копию оригинала для использования в случае отката.

Ответ 3

В Oracle, UPDATE всегда меняет исходную строку. Старые значения строки записываются в журнал UNDO и остаются там в течение некоторого времени как часть реализации управления multiversion concurrency (MVCC).

Пока новые значения не будут зафиксированы, все другие транзакции получат старые значения из журнала UNDO. То же самое происходит, если ваш запрос начался до COMMIT новых значений или с определенными режимами изоляции транзакций.

Если новые значения больше и строка больше не вписывается в одну страницу, строка переносится на новую страницу и освобождается место на старой странице.