開発に使用するデータベースのテスト用クローンをセットアップしました。ただし、この新しいデータベースに対してアプリケーションを実行すると、ロックが作成され、最終的にタイムアウトになり、永遠に待機します。
私の問題を引き起こす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
ただし、この 2 番目のトランザクションは、アプリケーションがタイムアウトするまで最初のトランザクションが完了するまで待機するため、決して実行されません。
- SQL Server 2008
- 私は実際の SQL をあまり制御できません。それには LLBLGen (ORM) を使用します。
- 開発データベースと本番データベースで問題なく動作します。
- test データベースは、dev データベースの新しいバックアップの復元によって作成されました
- 主な違いはテーブルの行数だと思います(開発では100000を超えるのに対し、テストでは100未満)
私の推測では、テーブルに多くの行がある場合、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
)