假设我们有一个只有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优化。
我正在使用SQL Server 2014