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

5

我有一个关于在SQL Server中使用多个进程同时向同一张表插入数据时锁定表的问题。

以下是我的问题:

  1. 在进行插入操作时,SQL Server默认会锁定表吗?
  2. 如果对于问题1的回答是肯定的,那么我们如何在插入数据时隐式地指明呢?
  3. 如果我有4张表,并且其中一张表具有来自其他3张表的外键,在这种情况下,我需要显式地使用表锁还是可以在没有锁定的情况下向这些表中插入记录?

请帮助我理解这个问题。


Re 2 你的意思是“明确提到”吗? Re 3 请详细说明你正在以什么顺序对哪些表进行操作。如果你知道某些共享操作不会冲突,请说明原因。 - philipxy
2个回答

13

SQL Server在执行插入操作时,默认不会锁定整个表,而是以按行的方式进行锁定,即新插入的行被锁定。

但是如果在单个事务中插入超过5000行数据,这种情况下保持如此多数量的锁会变得过于繁琐,因此SQL Server将进行锁升级并锁定整个表。


感谢您的回答 +1。 - Priyankara
这意味着在SQL Server中,它不允许同时向表中插入2行。Oracle数据库又如何?它是否也使用行锁定? - Priyankara
@user2781812:当然,只要单个事务没有锁定整个表,SQL Server 允许一次插入多个记录! - marc_s
你有MSDN参考资料吗? - alswl
1
@alswl:技术网站可以吗?锁升级(数据库引擎) - marc_s

6
  1. 这取决于表的大小和聚集索引的设置。如果CI允许页面锁定和行锁定,则这些是默认设置。如果多个页面被锁定,您将看到锁定升级,可能会达到表锁定。

  2. 如果您想显式锁定表,请在插入语句中使用 TABLOCK 提示(INSERT INTO MyTABLE WITH (TABLOCK)...)。

  3. 我不确定您的意思是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接