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 

ただし、この 2 番目のトランザクションは、アプリケーションがタイムアウトするまで最初のトランザクションが完了するまで待機するため、決して実行されません。

  1. SQL Server 2008
  2. 私は実際の SQL をあまり制御できません。それには LLBLGen (ORM) を使用します。
  3. 開発データベースと本番データベースで問題なく動作します。
  4. test データベースは、dev データベースの新しいバックアップの復元によって作成されました
  5. 主な違いはテーブルの行数だと思います(開発では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
)
4

1 に答える 1

0

テーブルに(質問と同じINSERTで)1000回の挿入を行ったところ、問題は解決しました。完全な解決策ではありませんが、明らかに問題を解決しています。

于 2012-10-02T12:00:44.030 に答える