2009-03-04 10 views
3

高レベルでTransactionScopeを使用して、データベースへの多数の接続を行う高レベルのコードをラップします。使用するデータベース分離レベルを高いレベルで指定する方法を教えてください。

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

トランザクションスコープ内で自分の関数を呼び出す場所の最高レベルで、トランザクションの分離レベルを設定する必要がありますか?

答えて

4

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

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

(コードは、私のブログ記事hereから盗まれた。)

+0

おかげで、私は私がそれを逃したのか分かりません。 – tpower

1

あなたは接続レベルとステートメント/トランザクション・レベルの両方でトランザクション分離レベルを定義することができます。

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

SQL Serverのデフォルトの分離レベルはRead Committedであることに注意してください。接続レベルで別の分離レベルを設定する場合は、更新前にトランザクション/文レベルでCommitedを読み込む必要があります。

もちろん、デフォルトの分離レベルをそのままのままにしておくことも考慮してください。 Read Committedが一般的な読書活動に適していないと感じる理由はありますか?

意味がありますか?それ以上の説明が必要な場合はお知らせください。

乾杯、

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

ハイエンドのOLTPデータベースを開発している場合は、行のバージョン管理と呼ばれるSQL Serverの技術/原則を調べるとよいでしょう。これにより、あるバージョンのレコードを読み上げることができます。このようなテクニックを使用するときはtempdbにオーバーヘッドがありますが、十分なハードウェアを使用している場合は適切かもしれません。 次のホワイトペーパーは、SQL Serverの行のバージョン/スナップショット分離に優れたガイド

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

+2

大きな挿入/削除操作が行われている間に、読み込み済みのコミットがブロックされています。 – tpower