Jak znaleźć bieżący poziom transakcji na serwerze SQL Server?Jak znaleźć aktualny poziom transakcji?
Odpowiedz
Run to:
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
Jeśli mówimy o aktualnej transakcji zagnieżdżania poziomu, to należy użyć @@TRANCOUNT
.
Jeśli mówimy o transakcję izolacja poziomie, użyj DBCC USEROPTIONS
i szukać opcją poziomie izolacji. Jeśli nie jest ustawiony, jest to przeczytane zatwierdzone.
Należy także pamiętać, DBCC USEROPTIONS jest niesamowite rozwiązaniem dla znalezienia poziom izolacji SESJI, ale może to być trudne - jeśli twój kod zmienia poziom izolacji na transakcję, te okresy, w których izolacja poziom różni się od domyślnej sesji może być trudny do uchwycenia. Na przykład, jeśli otworzysz sesję z poziomem izolacji x, ale zmienisz poziom izolacji na y na czas określonej transakcji w ramach sesji, DBCC USEROPTIONS nie da ci widoczności, jeśli zostanie wywołana poza tą transakcją. – DCaugs
W SQL Server 2012 "poziom izolacji" w 'DBCC USEROPTIONS' jest ustawiony na" read committed " –
DECLARE @UserOptions TABLE(SetOption varchar(100), Value varchar(100))
DECLARE @IsolationLevel varchar(100)
INSERT @UserOptions
EXEC('DBCC USEROPTIONS WITH NO_INFOMSGS')
SELECT @IsolationLevel = Value
FROM @UserOptions
WHERE SetOption = 'isolation level'
-- Do whatever you want with the variable here...
PRINT @IsolationLevel
Ten nie działa w SQL Azure – Ronny
+1, ponieważ również drukuje "migawkę", gdy jest używany wraz z zatwierdzonym odczytem (a nie domyślnym mechanizmem blokady współdzielonej). –
To jest przesada, po prostu wykonaj DBCC USEROPTIONS, jak mówi Thiagoh – user1075613
SELECT CASE
WHEN transaction_isolation_level = 1
THEN 'READ UNCOMMITTED'
WHEN transaction_isolation_level = 2
AND is_read_committed_snapshot_on = 1
THEN 'READ COMMITTED SNAPSHOT'
WHEN transaction_isolation_level = 2
AND is_read_committed_snapshot_on = 0 THEN 'READ COMMITTED'
WHEN transaction_isolation_level = 3
THEN 'REPEATABLE READ'
WHEN transaction_isolation_level = 4
THEN 'SERIALIZABLE'
WHEN transaction_isolation_level = 5
THEN 'SNAPSHOT'
ELSE NULL
END AS TRANSACTION_ISOLATION_LEVEL
FROM sys.dm_exec_sessions AS s
CROSS JOIN sys.databases AS d
WHERE session_id = @@SPID
AND d.database_id = DB_ID();
Proszę również rozwinąć kod, aby był bardziej edukacyjny. – lpapp
wystarczy uruchomić DBCC useroptions
a otrzymasz coś takiego:
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
i wskazuje "odczyt zatwierdzonego migawki", gdy jest aktywny (patrz RC migawka vs zablokowane), przynajmniej na SQL Server 2008 – user1075613
Ten działa w SQL Azure :-) – Ronny
Ten nie jest dokładny, jeśli poziom izolacji to" read_commited_snapshot ". W tym przypadku wyświetli się tylko "Readcommited". – GaTechThomas
@GaTechThomas, 'READ_COMMITTED_SNAPSHOT' nie jest poziom izolacji, to opcja bazy danych za pozwalając aby zmienić zachowanie' poziom izolacji ReadDCommitted' baz całej –