Как узнать текущий уровень транзакции?

Как узнать текущий уровень транзакций базы данных на SQL Server?


person dance2die    schedule 24.06.2009    source источник


Ответы (6)


Запустите это:

SELECT CASE transaction_isolation_level 
WHEN 0 THEN 'Unspecified' 
WHEN 1 THEN 'ReadUncommitted' 
WHEN 2 THEN 'ReadCommitted' 
WHEN 3 THEN 'Repeatable' 
WHEN 4 THEN 'Serializable' 
WHEN 5 THEN 'Snapshot' END AS TRANSACTION_ISOLATION_LEVEL 
FROM sys.dm_exec_sessions 
where session_id = @@SPID

справочник по постоянным значениям на docs.microsoft.com.

person SQLMenace    schedule 24.06.2009
comment
Это неверно, если уровень изоляции равен read_commited_snapshot. В этом случае будет отображаться только Readcommited. - person GaTechThomas; 28.05.2013
comment
@GaTechThomas, READ_COMMITTED_SNAPSHOT не является уровнем изоляции, это опция базы данных, позволяющая изменять поведение ReadDCommitted уровня изоляции для всей базы данных - person Gennady Vanin Геннадий Вани&; 11.12.2013
comment
@GaTechThomas, тогда как найти, что READ_COMMITTED_SNAPSHOT или READ_COMMITTED_Locked - person user960567; 15.12.2013
comment
@ user960567, IIRC, ответ Скотта Айви даст такие результаты. - person GaTechThomas; 15.12.2013
comment
К сожалению, это не работает для SQL Server 2000. - person zzzeek; 26.01.2017
comment
@zzzeek - это то, что вы получаете, если используете базу данных, которая устарела двенадцать лет назад. - person Martin Brown; 01.08.2017
comment
В некоторых случаях это неверно. Если у меня есть, например, уровень изоляции Read Commited Snapshot, приведенный выше код будет писать только ReadCommited. - person StupidOne; 25.07.2019
comment
@StupidOne Моментальный снимок зафиксированного чтения не является отдельным уровнем изоляции, поэтому показывать зафиксированное чтение является правильным. Это опция базы данных, которая изменяет поведение READ COMMITTED. Чтобы проверить, включен ли READ_COMMITTED_SNAPSHOT, взгляните на это: stackoverflow.com/a/51977/208318 - person Doug; 17.02.2020

просто запустите DBCC useroptions, и вы получите что-то вроде этого:

Set Option                  Value
--------------------------- --------------
textsize                    2147483647
language                    us_english
dateformat                  mdy
datefirst                   7
lock_timeout                -1
quoted_identifier           SET
arithabort                  SET
ansi_null_dflt_on           SET
ansi_warnings               SET
ansi_padding                SET
ansi_nulls                  SET
concat_null_yields_null     SET
isolation level             read committed
person thiagoh    schedule 30.09.2014
comment
и он указывает на прочитанный зафиксированный снимок, когда он активен (см. Снимок RC против заблокированного), по крайней мере, на SQL Server 2008 - person user1075613; 28.04.2017

Если вы говорите о текущем уровне вложенности транзакции, вы должны использовать @@TRANCOUNT.

Если вы говорите об уровне изоляции транзакции, используйте DBCC USEROPTIONS и ищите вариант уровня изоляции. Если он не установлен, он зафиксирован при чтении.

person Eric Petroelje    schedule 24.06.2009
comment
Также имейте в виду, что DBCC USEROPTIONS - отличный вариант для определения уровня изоляции вашего СЕССИЯ, но это может быть сложно - если ваш код изменяет уровень изоляции для каждой транзакции, те периоды времени, когда уровень изоляции отличается от уровня по умолчанию для сеанса, могут быть сложными. захватить. Например, если вы открываете сеанс с уровнем изоляции x, но изменяете уровень изоляции на y на время выполнения определенной транзакции в сеансе, DBCC USEROPTIONS не даст вам видимости этого, если вызывается вне этой транзакции. - person DCaugs; 18.10.2013
comment
В SQL Server 2012 уровень изоляции DBCC USEROPTIONS установлен на чтение зафиксировано - person Gennady Vanin Геннадий Вани&; 12.12.2013

person    schedule
comment
Пожалуйста, уточните код, чтобы он был более информативным. - person lpapp; 23.02.2014

person    schedule
comment
+1, так как он также печатает 'снимок', когда он используется вместе с фиксацией чтения (а не механизм общей блокировки по умолчанию) - person Shmil The Cat; 26.02.2014
comment
это излишество, просто выполните DBCC USEROPTIONS, как говорит тиагох - person user1075613; 28.04.2017

person    schedule
comment
Ваш ответ почти не отличается от этого ответа, который был опубликован более 7 лет назад. Вам следует отредактировать свой ответ, включив в него более подробную информацию о своем решении и / или объяснение как этот блок кода отвечает на вопрос. Это помогает обеспечить контекст и делает ваш ответ более полезным для будущих читателей. - person Hoppeduppeanut; 10.06.2021