SQL Server:锁定和独占类型的选择

时间:2016-12-03 19:53:52

标签: sql sql-server multithreading locking

假设我们有一个只有3列的表Users

UserId - primary key clustered int
Username - nvarchar(50)
CityId - int, which has a non-unique non-clustered index ( mouthful ).

如果我在一个标签中执行select并使用独占锁和begin tran:

declare @CityId int = 10

begin tran
    SELECT * 
    FROM [dbo].Users WITH (XLOCK,INDEX (MyCityIndex))  
    WHERE CityId = @CityId 

请注意,我不提交或回滚交易。

然后在另一个(是的另一个选项卡,SQL将会进行一些优化和工作)选项卡中,我运行:

declare @CityId int = 10

begin tran
    SELECT * 
    FROM [dbo].Users WITH (XLOCK, INDEX (MyCityIndex))  
    WHERE CityId = @CityId 

如果我使用相同的CityId(10),它显然会阻止。但我想如果我使用CityId = 11会发生什么?

declare @CityId int = 11

它会起作用。

但是如果我进行索引提示搜索它会起作用,否则它将无法工作,即使我放置CityId = 11,它也会阻塞并等待其他转换失败。

这里发生了什么?

当它使用独占锁读取数据时,执行全表扫描,然后一旦它到达锁定的记录,就会被阻止?真?

如果索引碎片化并且遇到实际被阻止且不包含其“id”的行,会发生什么。会阻止吗?

在进行测试时,请使用2个不同的选项卡进行选择,因为此处有SQL Server优化。

http://sqlblog.com/blogs/louis_davidson/archive/2006/12/13/does-xlock-always-prevent-reads-by-others.aspx

我正在使用SQL Server 2014

0 个答案:

没有答案