Я только что установил тестовый клон базы данных, которую мы используем для разработки. Однако, когда я запускаю наше приложение для этой новой базы данных, оно создает блокировку и в конце тайм-аут ждет вечно.
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
Однако эта вторая транзакция никогда не будет выполняться, так как она ожидает завершения первой до тех пор, пока не истечет время ожидания приложения.
- SQL Server 2008
- У меня нет большого контроля над фактическим SQL, мы используем для него LLBLGen (ORM)
- Он отлично работает с нашими базами данных разработки и производства.
- Тестовая база данных была создана путем восстановления новой резервной копии базы данных dev.
- Я думаю, что основное отличие заключается в количестве строк в таблице (‹100 в тесте по сравнению с> 100000 для dev)
Я предполагаю, что SQL-сервер делает что-то по-другому, когда в таблице много строк. Вопрос в том, как исправить тестовую базу данных, не добавляя в нее много-много данных, если это проблема, или что еще я должен сделать?
В таблице есть несколько индексов, а также FK в таблице транзакций по TransactionID:
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
)
TransactionID
? - person Martin Smith   schedule 01.10.2012