存储过程操作顺序

时间:2014-03-12 15:21:25

标签: stored-procedures merge sql-server-2008-r2 locking blocking

我有一个存储过程,它以创建临时表开始,然后根据查询填充临时表。

然后执行Merge语句,基本上更新临时表的物理表。最后,它在物理表上执行Update。非常基本的东西。

运行需要约8秒。我的问题是,它在什么时候锁定物理表?由于整个查询在运行之前被编译,物理表是在整个存储过程执行期间被锁定的,还是等到它到达实际与物理表一起使用的语句?

我不一定试图解决问题,而是确保我不会导致问题。我们还有其他流程需要重新设计才能减轻阻塞,我不想创建另一个流程。

1 个答案:

答案 0 :(得分:0)

好的,对于SQL Server:

  • 存储过程是"编译" (例如,确定执行计划)在它首次使用之前(并且执行计划缓存在计划缓存中,直到它因空间限制或者由于空间限制而被淘汰重启)。在确定执行计划时,表级别发生 - 没有锁,没有

  • SQL Server默认使用行级锁定,例如一行在读取,插入,更新或删除时被锁定 - 然后才会被锁定。因此,您的过程会将共享锁放置在选择数据的表上,以便将这些行插入临时表中,它会将独占锁放入要插入的行中临时表(对于操作/事务的持续时间),MERGE也将在需要时放置锁

默认情况下,SQL Server中的大多数锁(通常不是共享锁)都会保留到事务结束。除非您明确地专门处理事务,否则每个操作(MERGEUPDATEINSERT)都在其自己的隐式事务中运行,因此所持有的任何锁定都将在该交易的结束(例如该声明)。

锁定有很多方面 - 可以编写完整的书籍来涵盖所有细节 - 但这是否有助于您了解SQL Server中的锁定至少一点点?