如何判断当前操作的会话是否持有锁?SSMS可用查询方法
查看当前SSMS会话持有锁及未提交事务的查询方案
可以直接通过SQL Server提供的系统动态视图实现需求,通过内置变量@@SPID可以精准定位当前查询标签页对应的会话,完全避免和其他会话的锁、事务混淆。
查询当前会话持有的所有锁
执行以下语句即可返回当前会话持有的全部锁信息:
SELECT resource_type 锁资源类型, resource_database_id 所属数据库ID, resource_associated_entity_id 资源关联对象ID, request_mode 锁类型, request_status 锁状态, request_session_id 会话ID FROM sys.dm_tran_locks WHERE request_session_id = @@SPID;
结果字段说明:
- 锁资源类型:常见取值包括DATABASE(数据库级锁)、OBJECT(表级锁)、PAGE(数据页锁)、KEY(行级锁)
- 锁类型:常见取值包括S(共享锁)、X(排他锁)、IS(意向共享锁)、IX(意向排他锁)
- 锁状态:GRANT表示当前会话已经持有该锁,WAIT表示当前会话正在等待获取该锁
检测当前会话是否存在未提交事务
如果仅需要确认执行BEGIN TRAN后是否有未提交/回滚的事务,可以使用更简便的查询:
SELECT @@TRANCOUNT AS 当前会话未完成事务数;
说明:
- 每执行一次
BEGIN TRAN,该值会+1;每执行一次COMMIT,该值减1;执行ROLLBACK会直接将该值置为0 - 只要返回结果大于0,就说明当前会话存在未完成的事务
验证步骤参考
你可以按以下操作验证查询效果:
- 在当前SSMS查询标签页执行事务语句,不要提交:
BEGIN TRAN; -- 替换为你的测试表和测试条件即可 UPDATE test_table SET test_col = test_col WHERE id = 1;
- 运行上文的锁查询语句,即可看到当前会话持有的排他锁信息
- 执行
ROLLBACK后再次运行查询,会看到对应事务锁已被释放,@@TRANCOUNT也回归0
内容的提问来源于stack exchange,提问作者BVernon
相关产品推荐
相关产品推荐

