在SQL Server 2019中怎样编写存储过程排查未提交的长事务

云婷酱_7926

云婷酱_7926

2026-10-06

795人浏览

原创

最直接线索是关联 sys.dm_exec_sessions 与 sys.dm_tran_active_transactions:通过 session_id 和 transaction_id 连接二者,重点检查 open_transaction_count > 0 且 transaction_begin_time 显著早于当前时间(如超5分钟)、last_request_end_time 久远、status = 'sleeping' 的会话。

在sql server 2019中怎样编写存储过程排查未提交的长事务

查 sys.dm_exec_sessions 和 sys.dm_tran_active_transactions

长事务最直接的线索藏在两个动态管理视图里:sys.dm_exec_sessions 和 sys.dm_tran_active_transactions。前者告诉你谁连着、连了多久、是否在跑语句;后者告诉你事务从什么时候开始、状态如何、有没有被阻塞。关键不是单独看某一个,而是用 transaction_id 把它们 JOIN 起来。

常见错误是只查 sys.dm_tran_active_transactions,却漏掉 session_id,导致无法定位到具体连接——比如某个应用连接池里的空闲连接,其实还挂着未提交的事务。

  • 必须关联 sys.dm_exec_sessions.session_id = sys.dm_tran_session_transactions.session_id,再通过 transaction_id 连到 sys.dm_tran_active_transactions
  • 重点关注 open_transaction_count > 0 且 last_request_end_time 是很久以前(比如 30 分钟前)的会话
  • transaction_begin_time 比当前时间早超过 5 分钟,基本可判定为异常长事务

识别事务是否处于“活动但无操作”状态

很多长事务不是卡在 SQL 执行上,而是应用层拿到结果后忘了 COMMIT 或 ROLLBACK。这时候 sys.dm_exec_requests 里往往查不到正在运行的请求(status = 'sleeping'),但事务依然开着。

容易踩的坑是误以为 status = 'sleeping' 就代表安全——其实只要 open_transaction_count > 0,这个 sleeping 会话就可能正锁着表、阻塞别人。

Question AI
Question AI

一款面向学习和知识查询场景的AI助手,提供问题解答、内容和智能搜索等功能。

下载
  • 检查 sys.dm_exec_sessions.status 为 'sleeping',同时 sys.dm_exec_sessions.open_transaction_count > 0
  • 结合 sys.dm_exec_sessions.last_request_end_time 判断“睡了多久”,如果远大于业务预期(如订单处理通常 2 秒内完成),就是可疑点
  • 用 sys.dm_exec_sql_text(sql_handle) 查最后一次执行的语句,常能发现是 BEGIN TRAN 后没配对的 COMMIT

用存储过程封装自动检测逻辑

手动拼 DMV 查询太费事,写成存储过程可以定时跑、加告警、甚至集成进监控脚本。核心是把上面两个判断条件固化下来,避免每次都要重写 JOIN 条件。

注意别硬编码阈值——比如“5 分钟”这种值,应该作为 @MaxOpenMinutes 参数传入,方便不同环境(开发/生产)灵活调整。

  • 参数建议至少包含:@MaxOpenMinutes INT = 5、@ExcludeSystemSessions BIT = 1(过滤掉系统会话如 LAZY WRITER)
  • 返回字段必须含:session_id、login_name、host_name、program_name、transaction_begin_time、last_request_end_time
  • 避免在存储过程中直接 KILL 会话——那是运维动作,存储过程只负责“报”,不负责“杀”

为什么不能只依赖 DBCC OPENTRAN?

DBCC OPENTRAN 看起来简单,但它只返回每个数据库里“最早的活跃事务”,信息极其有限:没有 session_id、没有登录名、没有最后执行语句。遇到并发多、事务多的库,它几乎等于没用。

更麻烦的是,它不区分事务是真正在执行,还是只是 open 着等应用提交。线上出问题时,你真正需要的是“哪个应用、哪台机器、哪个用户、干了什么还没收尾”,而不是“最早那个事务是啥时候开的”。

  • DBCC OPENTRAN 只适合快速确认“有没有老事务”,不适合定位和分析
  • 它不支持 WHERE 过滤、不能 JOIN 其他视图、返回结果无法被 SELECT INTO 或 INSERT INTO
  • 在高并发 OLTP 场景下,它的输出经常滞后或不准,尤其当事务刚开启就挂起时
复杂点在于:事务是否“长”,不能只看时间绝对值,得结合业务上下文。比如一个批处理作业本来就要跑 20 分钟,你设 10 分钟告警反而误报;而一个 Web 接口事务超过 3 秒,基本就可以认定异常。这个分界线,得由熟悉业务的人来定,不是 DBA 闭着眼睛填个数字就行。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

存储过程

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4951

4

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2485

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3761

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2691

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

887

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2407

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2427

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2813

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2221

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
布尔教育燕十八mysql高级视频教程
布尔教育燕十八mysql高级视频教程

共24课时 | 8.6万人学习

魔乐科技oracle视频教程
魔乐科技oracle视频教程

共27课时 | 6.6万人学习

肖文吉Oracle视频教程
肖文吉Oracle视频教程

共33课时 | 9万人学习