Sql server 防止在大容量插入时锁定整个表
我有一个在表中执行大容量插入的存储过程。我在Sql server 防止在大容量插入时锁定整个表,sql-server,sql-server-2005,sql-server-2008,Sql Server,Sql Server 2005,Sql Server 2008,我有一个在表中执行大容量插入的存储过程。我在INSERT查询上方添加了begintransaction命令,以便在出现问题时启用rollback。启动大容量插入时,它锁定了整个表,其他用户无法在同一个表上执行SELECT 我不明白为什么SQL Server会锁定整个表,即使是SELECT 我正在使用SQLServer2005Express。这是这个版本的问题还是在2008年仍然存在?如何克服这种情况写入程序不应阻止读卡器您有一个打开的事务。这意味着SQL Server需要保留表的状态,并且您正在
INSERT
查询上方添加了begintransaction
命令,以便在出现问题时启用rollback
。启动大容量插入时,它锁定了整个表,其他用户无法在同一个表上执行SELECT
我不明白为什么SQL Server会锁定整个表,即使是SELECT
我正在使用SQLServer2005Express。这是这个版本的问题还是在2008年仍然存在?如何克服这种情况写入程序不应阻止读卡器您有一个打开的事务。这意味着SQL Server需要保留表的状态,并且您正在进行的任何更改都是“脏的”且未提交的 如果您从当前正在使用开放(显式)事务更改的表中选择
,则选择将等待,直到该表处于稳定状态且事务已提交或回滚
若要解决此问题,请不要在进程中指定。写入程序不应阻止读卡器
这仅适用于以下情况:所有其他隔离级别都要求读卡器阻止写操作,写入器阻止读卡器(不考虑脏读操作,因为它们是而且永远不应该使用)。如果需要此行为,则使用行版本控制(链接包含解决方案)
为什么大容量插入会锁定整个表
这实际上可能是真的,也可能不是真的。行为由您控制:
TABLOCK
指定在的持续时间内获取表级锁
批量导入操作。可以通过以下方式同时加载表:
如果表没有索引并且指定了TABLOCK,则会有多个客户端。
默认情况下,锁定行为由表选项table确定
锁定批量装载
有关更多详细信息,请阅读产品规格: