DBCC USEROPTIONS 是最直接、无需权限即可查出当前会话隔离级别的方法;sys.dm_exec_sessions 需要 VIEW SERVER STATE 权限但能跨会话查;SQL Server 无 @@TRANCOUNT 或 TRANSACTION_ISOLATION_LEVEL 等内置函数返回隔离级别。

DBCC USEROPTIONS 是最直接、无需权限即可查出当前会话隔离级别的方法;sys.dm_exec_sessions 需要 VIEW SERVER STATE 权限,但能跨会话查;而 @@TRANCOUNT 和 TRANSACTION_ISOLATION_LEVEL 函数并不存在——SQL Server 没有内置标量函数返回当前隔离级别。
用 DBCC USEROPTIONS 查当前会话设置
该命令输出当前会话所有 SET 选项,包括事务隔离级别。它不依赖权限,开发/测试环境随手就能跑:
DBCC USEROPTIONS;
输出中找 isolation level 这一行,值通常是 read committed、repeatable read 等小写字符串(注意不是常量名)。常见问题:
- 结果集是文本行,不能直接在 WHERE 或 JOIN 中用,需配合字符串解析(如
CHARINDEX+SUBSTRING)才能提取 - 如果连接启用了
READ_COMMITTED_SNAPSHOT数据库选项,这里仍显示read committed,但实际行为已变成行版本控制——这点极易误判 - 执行
SET TRANSACTION ISOLATION LEVEL SNAPSHOT后,DBCC USEROPTIONS显示的是snapshot,但前提是数据库已启用ALLOW_SNAPSHOT_ISOLATION ON,否则语句会报错
用 sys.dm_exec_sessions 查任意会话(含自己)
这个 DMV 的 transaction_isolation_level 列返回整数:1=Read Uncommitted,2=Read Committed,3=Repeatable Read,4=Serializable,5=Snapshot。比字符串更利于程序判断:
SELECT session_id, transaction_isolation_level FROM sys.dm_exec_sessions WHERE session_id = @@SPID;
但要注意:
- 需要
VIEW SERVER STATE权限,普通应用账号通常没有,DBA 或连接池初始化脚本里才常用 - 返回值是数字,不是字符串,别直接当成文字打印;比如值为 2 时,对应的是
READ COMMITTED,不是READ_COMMITTED(下划线是 T-SQL 语法里的写法,DMV 不带) - 该列只反映会话级
SET TRANSACTION ISOLATION LEVEL设置,不受数据库级快照选项影响——也就是说,即使READ_COMMITTED_SNAPSHOT已开启,这里仍返回 2
为什么不能用 @@TRANCOUNT 或自定义函数替代
@@TRANCOUNT 只表示当前嵌套事务深度,和隔离级别完全无关;SQL Server 没有类似 TRANSACTION_ISOLATION_LEVEL() 这样的内置标量函数。有人尝试用 DBCC USEROPTIONS 结果集插入临时表再查,但这是绕路:不仅多一步,还容易因结果集结构变化(如 SQL Server 版本升级后列顺序调整)导致解析失败。
真正需要程序化获取时,推荐封装成一个带错误处理的存储过程,先查 sys.dm_exec_sessions,权限不足时降级用 DBCC USEROPTIONS 字符串匹配——但必须预设好各版本可能的返回字符串变体(例如 SQL Server 2025 在某些语言环境下可能返回本地化文本)。










