0

私のクライアント セッションの 1 つは、トランザクションからテーブルにエントリを作成し、その処理を続行します。トランザクションは分離モードで実行されますread committed。一方、他のクライアント セッションは、テーブル内のすべてのデータを報告します。

ロックされた行 (他のクライアントによって挿入された) のため、すべての選択アクションは完全にロックされています。

完全にロックされるのではなく、すべて選択中にコミットされたデータを取得するにはどうすればよいですか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

使用シナリオについてはあまり具体的ではありませんが、テーブルからデータを取得することは可能です。いくつかの重大な警告があります。

marc_s が言ったように、スナップショット分離レベルを使用できます。これは、トランザクション内のすべての選択ステートメントでREAD UNCOMMITTED使用するのと同じ効果があります。WITH (NOLOCK)そのテーブルだけを読み取りたいが、トランザクション内の他のすべての読み取りを通常どおりに処理する場合はNOLOCK、クエリ内の特定のテーブルにヒントを配置することをお勧めします。たとえば、次のようになります。

SELECT *
  FROM firstTable f INNER JOIN
       secondTable s WITH (NOLOCK) on f.Key = s.Key

これは通常の読み取りロックを発行しますfirstTableが、ロックなしで読み取りますsecondTable。事実上破損したデータを取り出すことができるため、ロックは非常に危険ではありません。実行中の挿入によってデータが並べ替えられ、ページ分割が発生した場合、同じ行が 2 回出力され、あらゆる種類の同様の不快感が発生する可能性があります。

可能ですが、理想的ではなく、影響に注意する必要があります。Jason Strate の厚意により、さらに詳しい資料がここにあります。

于 2012-07-10T16:12:42.540 に答える