SQL Server表锁定/锁定

时间:2018-11-07 05:59:00

标签: sql sql-server tsql

以下面的示例为例,假设TABLE1包含一百万条记录;

  1. SELECT * INTO TMP_TABLEA FROM TABLE1
  2. SELECT * INTO TMP_TABLEB FROM TABLE1
  3. INSERT INTO TMP_TABLEC (COLUMN1) SELECT COLUMN1 FROM TABLE1

问题;

  1. 考虑到查询已同时执行,TABLE1是否将被锁定?还是会造成阻塞?
  2. 这是否会严重影响每个查询的执行性能?

3 个答案:

答案 0 :(得分:1)

在SQL Server中,读取器永远不会阻塞读取器。所以不,这些语句都不会相互阻塞。因为尽管他们写表,但他们写的表却不同。

第一条语句将独占锁定TMP_TABLEA,但是它将在默认隔离级别下将共享锁置于TABLE1上。

第二条语句将独占锁定TMP_TABLEB,但是它将在默认隔离级别下将共享锁置于TABLE1上。

第三条语句将放置TMP_TABLEC的排他锁(行,页或整个对象)。但是它将在默认隔离级别下将共享锁置于TABLE1上。

显然,它会影响性能,因为您要SQL Server同时执行三件事。但是,使用三个连接同时执行所有三个语句比仅使用一个连接连续执行它们要快。

答案 1 :(得分:0)

  1. 考虑到查询已同时执行,TABLE1是否将被锁定?还是会造成阻塞?

回答:是的,但是共享锁(实际上是Read Committed锁)将应用于TABLE1,该表在行被一一读取时被释放。因为它是一个共享锁,所以它是非阻塞锁。

  1. 这是否会严重影响每个查询的执行性能?

答案:是的。但是,通过在TABLE1中使用某种分区,可以大大提高性能。因此,它可以利用您尝试使用的多核CPU。另外,请确保已正确设置了TABLE1的索引。

答案 2 :(得分:0)

由于TABLE1中没有写操作,所以不会发生阻塞。

在读取操作期间,共享锁。这意味着没有障碍。

在写操作期间,排他锁。这意味着封锁。

但是肯定会导致速度变慢。因为TABLE1正在将其可用资源共享给“ n”个操作。

相关问题