在SQL Server数据库中插入数据时锁定表

时间:2014-07-10 15:53:27

标签: sql-server database locks

我对SQL Server中的表锁定有疑问,同时使用多个进程将数据一次插入到同一个表中。

以下是我的问题,

  1. 执行插入时,SQL服务器的默认行为是锁定表吗?
  2. 如果是Q1,那么我们如何在插入数据时隐式提及。
  3. 如果我有4个表,并且一个表中有3个表的其余部分有外键,那么在这种情况下我是否需要显式使用表锁,否则我可以在这些表中插入记录?
  4. 请帮我理解一下。

2 个答案:

答案 0 :(得分:9)

  

执行插入时,SQL服务器的默认行为是锁定表吗?

没有。 SQL Server默认锁定按行 - 因此插入的新行被锁定 - 但不是整个表。

如果在单个事务中插入超过5000行,则会发生这种情况。在这种情况下,保持许多单独的锁只会变得太多,SQL Server将执行锁定升级并改为锁定整个表。

答案 1 :(得分:5)

  1. 它取决于表的大小和聚簇索引上的设置(如果存在)。如果CI具有页锁并允许行锁,则这些是默认值。如果多个页面被锁定,您将看到锁定升级,可能最多是表锁定。

  2. 如果您想明确锁定表格,可以使用插页TABLOCK

  3. 上的INSERT INTO MyTABLE WITH (TABLOCK)...提示
  4. 我不确定你的意思。