В случае нескольких обновлений одной и той же записи в одной транзакции, сколько версий хранится?

11

В соответствии со статьей MSDN Кимберли Л. Триппа, Нил Грейвс " Изоляция транзакций на основе управления версиями строк в SQL Server 2005"

  • «... Все более ранние версии конкретной записи объединены в связанный список, и в случае длительных транзакций на основе управления версиями строк необходимо будет проходить ссылку при каждом доступе, чтобы достичь транзакционно-согласованной версии ряд"

который находится в разделе «Общие сведения о управлении версиями строк» ​​и используется в следующих разделах: «Управление версиями строк в Read Committed с использованием контроля версий строк» ​​и «Управление версиями строк в изоляции моментальных снимков».

Далее, пример контроля версий строк из-за модификаций приведен в контексте множественных обновлений одной и той же записи несколькими транзакциями (T1, T2, T3) только в SNAPSHOT.

Если только одна транзакция обновляет запись несколько раз (с помощью нескольких операторов), будут ли сохранены (связаны) несколько хранилищ версий или только тот, который был взят в момент снятия «образа» SNAPSHOT?

Ну, ответ на этот вопрос должен немедленно ответить на мои другие ожидающие вопросы:

Fulproof
источник

Ответы:

11

В случае нескольких обновлений одной и той же записи в одной транзакции, сколько версий хранится?

Только один.

Первое обновление строки генерирует версию строки и блокирует ее исключительно. Более поздние обновления той же строки в той же транзакции не генерируют новые версии строк.


Связанный список версий строк может выглядеть следующим образом:

  • Транзакция T1 в транзакции SNAPSHOT читает строку и видит значение «a».

  • Транзакция T2 (при любом уровне изоляции) обновляет значение с «a» до «b» и фиксирует. Это создает версию строки для значения «a».

  • Транзакция T3 (при любом уровне изоляции) обновляет значение с «b» до «c» и фиксирует. Это создает версию строки для значения «b». Эта версия строки ссылается на предыдущую версию строки для «а».

  • Транзакция T1 считывает значение строки, перемещая ссылку от значения, сохраненного на текущей странице («c»), к версии строки «b», а затем обратно к версии строки «a».

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

Пол Уайт 9
источник