3

高レベルで s を使用TransactionScopeして、データベースへの多数の接続を行う高レベル コードをラップしています。

read uncommitted私が呼び出す関数の 1 つは、分離レベルが必要な読み取り専用関数に使用される一般的な読み取りです。ただし、場合によっては、大規模な更新操作の一部として使用され、 のread committed方が適しています。

トランザクション スコープ内で関数を呼び出している最上位レベルで、トランザクションの分離レベルを設定できる必要がありますか?

4

2 に答える 2

4

TransactionScope自体で分離レベルを設定できます。それはあなたが意味することですか?

using (var txn = new TransactionScope(
    TransactionScopeOption.Required, 
    new TransactionOptions
    {
        IsolationLevel = IsolationLevel.ReadUncommitted
    }
))
{
    // Your LINQ to SQL query goes here
}

(ここにある私のブログ投稿から盗まれたコード。)

于 2009-03-04T09:59:36.693 に答える
1

トランザクション分離レベルは、接続レベルとステートメント/トランザクションレベルの両方で定義できます。

シナリオを正しく理解している場合、特定の接続内の他のアクティビティの大部分が読み取り専用アクティビティになる場合は、特定の更新クエリの前にのみトランザクション分離レベルを調整することを検討します。

SQL Serverのデフォルトの分離レベルは読み取りコミットであることに注意してください。したがって、接続レベルで別の分離レベルを設定する場合は、更新前にトランザクション/ステートメントレベルで読み取りコミットに切り替える必要があります。

もちろん、考慮すべきことの1つは、デフォルトの分離レベルをそのままにしておくことです。Read Committedが一般的な読み取りアクティビティに適さないと感じる特定の理由はありますか?

わかる?さらに詳しい説明が必要な場合はお知らせください。

乾杯、ジョン

コメントに基づいて更新。

十分に公平なことですが、ハイエンドのOLTPデータベースを開発している場合は、行のバージョニングと呼ばれるSQLServerテクノロジ/原則を検討することをお勧めします。これにより、いわばレコードのバージョンの読み取りを実行できるようになります。このような手法を使用すると、tempdbにオーバーヘッドが発生しますが、十分なハードウェアを使用している場合は、それが適切な場合があります。次のホワイトペーパーは、SQLServerの行のバージョン管理/スナップショットアイソレーションに関する優れたガイドです。

http://msdn.microsoft.com/en-us/library/ms345124.aspx

于 2009-03-04T09:59:46.020 に答える