COMMIT
我在没有新的查询窗口(Query1)的情况下编写了这个脚本:
BEGIN TRAN
SELECT [RegionID], [RegionDescription]
FROM [Northwind].[dbo].[Region] WITH(XLOCK,ROWLOCK)
WHERE RegionID = 3
在另一个查询窗口中,我在没有 COMMIT 的情况下编写了这个脚本(Query2):
BEGIN TRAN
SELECT [RegionID], [RegionDescription]
FROM [Northwind].[dbo].[Region] WITH(XLOCK,ROWLOCK)
WHERE RegionID = 1
一切正常,当我运行 Query1 然后运行 Query2 时,我可以选择带有RegioID=1
. 但是如果我这样写第一个查询(Query3):
BEGIN TRAN
SELECT [RegionID], [RegionDescription]
FROM [Northwind].[dbo].[Region] WITH(XLOCK,ROWLOCK)
WHERE RegionID = 3 OR RegionID = 4
...并添加RegionID = 4
结果,我无法运行 Query2。为什么 Query2 结果与 Query3 没有相交我无法运行它?
第三个查询有一个 OR,这很可能意味着正在发生扫描。扫描将被阻止
RegionID = 1
如果你运行它,它应该运行正常。
另一种方法是您仍然有查询 1 交易打开...
编辑:
我无法重现它(SQL Server 2008 R2 x64 开发人员)。我在查询 3 上得到一个索引搜索。
但是,在我的第一次迭代中,我忘记了我的表上的 PRIMARY KEY,并且 query1 阻止了 query2,因为它是表扫描。这主要支持我上面的回答
编辑2:
我无法让查询 2 或查询 3 互相阻止(无论哪个先运行)
评论后: