sys.dm_tran_active_snapshot_database_transactions

В экземпляре SQL Server это динамическое административное представление возвращает виртуальную таблицу всех активных транзакций, формирующих или потенциально получающих доступ к версиям строк. Транзакции включаются для одного или нескольких из следующих условий.

  • Если одному или обоим параметрам базы данных ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT присвоены значения ON.

    • Для каждой транзакции имеется одна строка, запускающаяся на уровне изоляции моментальных снимков, либо на уровне READ COMMITTED с использованием версий строк.

    • Для каждой транзакции имеется одна строка, вызывающая создание версии строки в текущей базе данных. Например, транзакция формирует версию строки путем обновления или удаления строки из текущей базы данных.

  • При срабатывании триггера имеется одна строка для транзакции, в которой выполняется триггер.

  • При запуске процедуры оперативного индексирования имеется одна строка для транзакции, которая создает индекс.

  • При включенном режиме MARS имеется одна строка для каждой транзакции, которая получает доступ к версиям строк.

Это динамическое административное представление не включает в себя системные транзакции.

Синтаксис

sys.dm_tran_active_snapshot_database_transactions

Возвращенные таблицы

Имя столбца

Тип данных

Описание

transaction_id

bigint

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

transaction_sequence_num

bigint

Порядковый номер транзакции. Порядковый номер транзакции является уникальным и присваивается транзакции в момент ее запуска. Транзакции, которые не создают записи версий и не используют сканирование моментальных снимков, не получат порядковый номер. Дополнительные сведения см. в разделе Основные сведения об уровнях изоляции на основе управления версиями строк.

commit_sequence_num

bigint

Порядковый номер, который указывает, когда транзакция заканчивается (фиксируется или останавливается). Для активных транзакций значение равно NULL.

is_snapshot

int

0 = транзакция, отличная от изоляции моментального снимка.

1 = транзакция изоляции моментального снимка.

session_id

int

Идентификатор сеанса, в рамках которого была инициирована транзакция.

first_snapshot_sequence_num

bigint

Наименьший последовательный номер транзакции, которая была активна во время формирования моментального снимка. При выполнении транзакции моментального снимка она формирует моментальный снимок активных в этот момент транзакций. Для транзакций, не связанных с моментальными снимками, в этом столбце отображается 0.

max_version_chain_traversed

int

Максимальная длина цепочки версий, пройденной в поисках транзакционно согласованной версии.

average_version_chain_traversed

real

Среднее число версий строк по всем пройденным цепочкам версий.

elapsed_time_seconds

bigint

Время, истекшее с момента, когда транзакция получила свой порядковый номер.

Разрешения

Требует разрешения VIEW SERVER STATE на сервере.

Замечания

Представление sys.dm_tran_active_snapshot_database_transactions содержит сведения о транзакциях, которым был назначен порядковый номер (XSN). Порядковый номер XSN назначается при первом доступе транзакции к хранилищу версий. В следующих примерах показано, как в базе данных, для которой включена изоляция моментальных снимков или READ COMMITTED с использованием управления версиями строк, транзакции назначается номер XSN.

  • Если транзакция выполняется на упорядочиваемом уровне изоляции, номер XSN назначается при первом выполнении транзакцией какой-либо инструкции, например операции UPDATE, в ходе которой создается версия строки.

  • Если транзакция выполняется на уровне изоляции моментальных снимков, номер XSN назначается при выполнении какой-либо инструкции языка обработки данных (DML), включая операцию SELECT.

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

Дополнительные сведения о порядковых номерах транзакций см. в разделе Основные сведения об уровнях изоляции на основе управления версиями строк.

Примеры

В следующем примере используется тестовый сценарий, в котором четыре параллельные транзакции, каждую из которых идентифицирует порядковый номер (XSN), выполняются в базе данных с параметрами ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT, установленными в значение ON. Выполняются следующие транзакции:

  • XSN-57 — операция обновления с упорядочиваемым уровнем изоляции.

  • XSN-58 — то же, что и XSN-57.

  • XSN-59 — операция выборки с уровнем изоляции моментальных снимков.

  • XSN-60 — то же, что и XSN-59.

Выполняется следующий запрос.

SELECT 
    transaction_id,
    transaction_sequence_num,
    commit_sequence_num,
    is_snapshot session_id,
    first_snapshot_sequence_num,
    max_version_chain_traversed,
    average_version_chain_traversed,
    elapsed_time_seconds
  FROM sys.dm_tran_active_snapshot_database_transactions;

Ниже приводится результирующий набор.

transaction_id  transaction_sequence_num  commit_sequence_num
--------------  ------------------------  -------------------
9295            57                        NULL
9324            58                        NULL
9387            59                        NULL
9400            60                        NULL

is_snapshot  session_id   first_snapshot_sequence_num
-----------  -----------  ---------------------------
0            54           0
0            53           0
1            52           57
1            51           57

max_version_chain_traversed  average_version_chain_traversed
---------------------------  -------------------------------
0                            0
0                            0
1                            1
1                            1

elapsed_time_seconds
--------------------
419
397
359
333

Результаты из представления sys.dm_tran_active_snapshot_database_transactions вычисляются следующим образом.

  • XSN-57: Так как эта транзакция выполняется не на уровне изоляции моментальных снимков, значения параметров is_snapshot и first_snapshot_sequence_num равны 0. Параметр transaction_sequence_num указывает, что этой транзакции был назначен порядковый номер, так как для одного или обоих параметров базы данных ALLOW_SNAPSHOT_ISOLATION и READ_COMMITTED_SNAPSHOT установлены значения ON.

  • XSN-58: Эта транзакция выполняется не на уровне изоляции моментальных снимков, и к ней применяются те же правила, что и к транзакции XSN-57.

  • XSN-59: Это первая активная транзакция, которая выполняется на уровне изоляции моментальных снимков. Транзакция считывает данные, зафиксированные транзакцией XSN-57, на что указывает параметр first_snapshot_sequence_num. Вывод этой транзакции также указывает на то, что максимальная цепочка версий, пройденная для строки, равна 1 и что для каждой строки, к которой был получен доступ, пройдена в среднем 1 версия. Это означает, что транзакции XSN-57, XSN-58 и XSN-60 не изменяли строки и были зафиксированы.

  • XSN-60: Это вторая транзакция, выполняемая с изоляцией моментальных снимков. Вывод содержит такие же сведения, что и для транзакции XSN-59.