2

我刚刚设置了我们用于开发的数据库的测试克隆。但是,当我针对这个新数据库运行我们的应用程序时,它会创建一个锁并最终超时等待永远。

造成我的问题的 SQL:

-- In one connection it runs this
set transaction isolation level read committed
begin tran
INSERT INTO [Test].[dbo].[Status] ([TransactionID], [Status]) VALUES (6122481, 1)

然后在提交该事务之前,另一个连接尝试运行:

set transaction isolation level read committed
begin tran
SELECT * FROM [Test].[dbo].[Status] with(rowlock) WHERE [Test].[dbo].[Status].[TransactionID] = 6122482 

但是,第二个事务永远不会运行,因为它会永远等待第一个事务完成,直到应用程序超时。

  1. SQL Server 2008
  2. 我对实际的 SQL 没有太多控制,我们使用 LLBLGen (ORM)
  3. 它在我们的开发和生产数据库上运行良好。
  4. 测试数据库是通过恢复 dev 数据库的新备份创建的
  5. 我认为主要区别在于表中的行数(测试中<100,而开发者> 100000)

我的猜测是,当表中有很多行时,SQL 服务器会做不同的事情。问题是如果这是问题所在,如何在不向其中添加大量数据的情况下修复测试数据库,或者我应该怎么做?

该表有一些索引,还有一个关于 TransactionID 的事务表的 FK:

CREATE NONCLUSTERED INDEX [idx1] ON [dbo].[Status] 
(   [TransactionID] ASC,
    [Status] ASC
) INCLUDE ( [Created]) 

CREATE NONCLUSTERED INDEX [idx2] ON [dbo].[Status] 
(   [Status] ASC,
    [Created] ASC
) INCLUDE ( [TransactionID]) 

ALTER TABLE [dbo].[Status] ADD  CONSTRAINT [PK_Statuses] PRIMARY KEY CLUSTERED 
(   [StatusID] ASC
)
4

1 回答 1

0

我在表中做了 1000 次插入(与问题中的插入相同),问题就消失了。不是一个完美的解决方案,但显然可以解决问题。

于 2012-10-02T12:00:44.030 回答