Stored procedures 存储过程操作顺序

Stored procedures 存储过程操作顺序,stored-procedures,merge,sql-server-2008-r2,locking,blocking,Stored Procedures,Merge,Sql Server 2008 R2,Locking,Blocking,我有一个存储过程,它首先创建一个临时表,然后根据查询填充临时表 然后它执行一个Merge语句,基本上更新临时表之外的物理表。最后,它对物理表进行更新。非常基本的东西 运行大约需要8秒。我的问题是,它在什么时候锁定物理表?因为整个查询是在运行之前编译的,所以在整个存储过程的执行过程中,物理表是被锁定的,还是等待它到达实际使用物理表的语句 我不一定要解决一个问题,而是要确保我不会引起问题。我们还有其他流程需要重新设计以减轻阻塞,我不想再创建另一个流程。好的,对于SQL Server: 编译存储过程,

我有一个存储过程,它首先创建一个临时表,然后根据查询填充临时表

然后它执行一个Merge语句,基本上更新临时表之外的物理表。最后,它对物理表进行更新。非常基本的东西

运行大约需要8秒。我的问题是,它在什么时候锁定物理表?因为整个查询是在运行之前编译的,所以在整个存储过程的执行过程中,物理表是被锁定的,还是等待它到达实际使用物理表的语句

我不一定要解决一个问题,而是要确保我不会引起问题。我们还有其他流程需要重新设计以减轻阻塞,我不想再创建另一个流程。

好的,对于SQL Server:

编译存储过程,例如,在执行计划首次使用之前确定执行计划,并将该执行计划缓存在计划缓存中,直到由于空间限制或重新启动而抛出为止。在确定执行计划时,表级别上不会发生任何事情—没有锁,什么都不会发生

默认情况下,SQL Server将使用行级锁定,例如,当读取、插入、更新或删除行时,即锁定该行,然后再锁定。因此,您的过程将对从中选择数据以将这些行插入临时表的表放置共享锁,并在操作/事务期间对插入临时表的行放置排他锁,并且在需要时合并也将放置锁

默认情况下,大多数锁(通常在SQL Server中不是共享锁)会一直保留到事务结束。除非您明确地处理事务,否则每个操作MERGE、UPDATE、INSERT都会在其自己的隐式事务中运行,因此任何持有的锁都会在该事务(例如该语句)结束时释放


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

此外,许多数据库系统都有不同类型的锁。可能是放置了一个锁,防止对表应用任何DDL更改,但允许任何其他DML语句对表中的数据进行更改。您对任何类型的锁感兴趣还是只对特定的锁感兴趣?它是SQL 2008 R2 db。我希望确保最终用户能够尽快访问表中的数据。