2016-05-19 5 views
0

会計システム(SQL Server 2008 R2 Standard Edition)の大きなテーブル(1億以上の行)のイテレータ(bigint)を使用して新しいデータをクエリするWebサービスを構築しました。SELECTでロックするSELECT

データベースのプロバイダは、コミットされていないトランザクションを読み取って、挿入のためにテーブルをロックアップしないようにしました(更新は行われません)。

最近、ロールバックによるトラブルが発生しました。アカウンティングシステムには、エラーやタイムアウトのためにWebサービスがすでに読み込んでいた行をロールバックしています。

私はコミットされたデータを読んでこれを解決すると思いますが、会計システムのプロバイダはテーブルに挿入をロックすることを心配しているので、私たちには許可しません。

選択は実際に挿入をブロックし、どのようにして解決するのがベストでしょうか?

+0

どうすれば 'with nolock'を使用するのですか? – ChrisBint

+0

これは基本的に私がやっていることです(コミットされていないと読んでいます)。私がしたいことは、挿入ロックを引き起こすことなくコミットされたものを読むことです。 – FredrikR

+0

プロバイダは、コミットされたスナップショットの分離を読み取るようにデータベースを設定する必要があります。https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-ガイド/。これにより、トランザクションをブロックすることなくトランザクションを開始する前の状態でレコードを読み取ることができます。 –

答えて

0

汚れていない(書き込み中の)データのみを選択してみてください。たとえば、データベースに行が挿入された日付が記入された列がcreateddateの場合、5分後に挿入された行のみを取り出すwhere条件を作成します。

SELECT col1, col2, col3, createddate 
FROM table WITH(NOLOCK) 
WHERE createddate < dateadd(minute,-5,getdate()) 
0

これは設計上の問題と同じくらい技術的な問題ではありません。コミットされたデータを判断するために必要な時間枠の後に、コミット済みトランザクションを含むこのテーブルのコピーである新しいテーブルを作成することをお勧めします。それ以外の場合は、会計システムの別のベンダーを探すことをお勧めします。