【发布时间】:2010-11-05 12:06:24
【问题描述】:
如何在 SQL Server 上找到当前数据库的事务级别?
【问题讨论】:
标签: sql sql-server sql-server-2008 sql-server-2005 isolation-level
如何在 SQL Server 上找到当前数据库的事务级别?
【问题讨论】:
标签: sql sql-server sql-server-2008 sql-server-2005 isolation-level
运行这个:
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
【讨论】:
READ_COMMITTED_SNAPSHOT 不是隔离级别,它是一个数据库选项,允许在数据库范围内更改 ReadDCommitted 隔离级别的行为
只要运行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
【讨论】:
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();
【讨论】:
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
【讨论】:
如果您谈论的是当前事务嵌套级别,那么您将使用@@TRANCOUNT。
如果您在谈论事务隔离级别,请使用DBCC USEROPTIONS 并查找隔离级别的选项。如果未设置,则已提交读取。
【讨论】:
DBCC USEROPTIONS 的“隔离级别”设置为“已提交读”
SELECT CASE
WHEN transaction_isolation_level = 0 THEN 'Unspecified'
WHEN transaction_isolation_level = 1 THEN 'Read Uncommitted'
WHEN transaction_isolation_level = 2 AND d.snapshot_isolation_state_desc = 'OFF' THEN 'Read Committed'
WHEN transaction_isolation_level = 2 AND d.snapshot_isolation_state_desc = 'ON' AND d.is_read_committed_snapshot_on = 1 THEN 'Snapshot Read Committed'
WHEN transaction_isolation_level = 2 AND d.snapshot_isolation_state_desc = 'ON' AND d.is_read_committed_snapshot_on = 0 THEN 'Snapshot'
WHEN transaction_isolation_level = 3 THEN 'Repeatable Read'
WHEN transaction_isolation_level = 4 THEN 'Serializable' END AS TRANSACTION_ISOLATION_LEVEL,
d.is_read_committed_snapshot_on,
d.snapshot_isolation_state_desc
FROM sys.dm_exec_sessions
CROSS JOIN sys.databases AS d
where session_id = @@SPID
AND d.database_id = DB_ID();
【讨论】: