SQL调试查询与在Management Studio中调试同时运行-锁定的数据将查询挂起

Sha*_*wan 5 sql-server visual-studio

场景:我正在调试一些存储过程,并遇到了断点。

现在,我想执行一些查询,以便进一步调试问题。 我怎么做?

我尝试从新的查询窗口执行查询,但是似乎调试经验已锁定所有表。

即时窗口似乎也遇到了同样的问题。

Stu*_*tLC 3

我尝试从新的查询窗口执行查询,但似乎调试经验已锁定所有表

这正是您正在调试的存储过程执行时会发生的情况,因此这是一个值得发现的“好”事情。INSERT发生“挂起”是因为您的 Proc 持有此数据的锁(例如,由于or的结果UPDATE)并且尚未提交其事务。其他尝试在隔离级别READ COMMITTED(通常是默认级别)上读取未提交数据的连接将被阻塞,直到 PROC 通过提交或回滚释放这些锁。

您可以通过在该连接上设置较弱的隔离级别来读取其他临时调试查询连接上过去(大多数)的锁定,例如

-- Separate debugging query when the breakpoint is set on the actual code
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableLockedByProcBeingDebugged WHERE ...
Run Code Online (Sandbox Code Playgroud)

或与NOLOCK

SELECT * FROM TableLockedByProcBeingDebugged (NOLOCK) WHERE ...
Run Code Online (Sandbox Code Playgroud)

这应该允许您读取数据的瞬态。

只是为了说明显而易见的事情:

  • 仅将此用于调试 - 正如隔离级别所建议的那样,READ UNCOMMITTED尚未提交,并且可以在页面拆分期间返回幽灵读取甚至重复读取。
  • 如果PROC正在升级锁(例如从行到整个表),您将需要解决这个问题,例如一次更新更少的记录。