我有一个存储过程,它以创建临时表开始,然后根据查询填充临时表。
然后执行Merge
语句,基本上更新临时表的物理表。最后,它在物理表上执行Update
。非常基本的东西。
运行需要约8秒。我的问题是,它在什么时候锁定物理表?由于整个查询在运行之前被编译,物理表是在整个存储过程执行期间被锁定的,还是等到它到达实际与物理表一起使用的语句?
我不一定试图解决问题,而是确保我不会导致问题。我们还有其他流程需要重新设计才能减轻阻塞,我不想创建另一个流程。
答案 0 :(得分:0)
好的,对于SQL Server:
存储过程是"编译" (例如,确定执行计划)在它首次使用之前(并且执行计划缓存在计划缓存中,直到它因空间限制或者由于空间限制而被淘汰重启)。在确定执行计划时,表级别发生无 - 没有锁,没有
SQL Server默认使用行级锁定,例如一行在读取,插入,更新或删除时被锁定 - 然后才会被锁定。因此,您的过程会将共享锁放置在选择数据的表上,以便将这些行插入临时表中,它会将独占锁放入要插入的行中临时表(对于操作/事务的持续时间),MERGE
也将在需要时放置锁
默认情况下,SQL Server中的大多数锁(通常不是共享锁)都会保留到事务结束。除非您明确地专门处理事务,否则每个操作(MERGE
,UPDATE
,INSERT
)都在其自己的隐式事务中运行,因此所持有的任何锁定都将在该交易的结束(例如该声明)。
锁定有很多方面 - 可以编写完整的书籍来涵盖所有细节 - 但这是否有助于您了解SQL Server中的锁定至少一点点?