一个进程可包含多少事务?sys.sysprocesses的open_tran字段含义咨询
sys.sysprocesses.open_tran返回值为2的问题解答
open_tran字段的核心含义
sys.sysprocesses是SQL Server保留的兼容级系统视图,其中open_tran返回的是当前会话的事务计数,并非会话内打开的独立事务数量,单个进程的该字段返回值大于1属于完全合法的场景。
事务计数大于1的触发逻辑
SQL Server不存在单会话并行多个独立事务的能力,计数叠加的本质是嵌套事务的计数规则:
- 每执行一次
BEGIN TRANSACTION语句,会话级事务计数@@TRANCOUNT就会+1,open_tran的返回值和@@TRANCOUNT完全同步 - 每执行一次
COMMIT TRANSACTION语句,计数仅会-1,只有计数降到0时才会真正提交事务 - 单次
ROLLBACK TRANSACTION会直接将计数清零,回滚所有未提交操作,不受嵌套层级影响
复现open_tran=2的具体示例
你可以在SSMS的单个查询窗口中执行以下代码,直接复现该场景:
-- 第一次开启事务,事务计数变为1 BEGIN TRANSACTION; SELECT @@TRANCOUNT AS 当前事务计数; -- 第二次开启事务,计数叠加为2,此时open_tran返回值即为2 BEGIN TRANSACTION; SELECT @@TRANCOUNT AS 当前事务计数; -- 查询当前进程的open_tran字段,验证返回值为2 SELECT spid, open_tran FROM sys.sysprocesses WHERE spid = @@SPID; -- 注意:执行1次COMMIT后计数仅降到1,事务仍未提交 COMMIT TRANSACTION; SELECT @@TRANCOUNT AS 当前事务计数; -- 再执行1次COMMIT计数降到0,事务才真正提交 COMMIT TRANSACTION;
补充说明
sys.sysprocesses属于遗留兼容视图,在SQL Server 2005及之后的版本中,更建议使用sys.dm_tran_session_transactions动态管理视图的transaction_count字段获取相同信息,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Avahita
相关产品推荐
相关产品推荐

