2

linq を使用した Dbml ファイルの提案が必要です。大量のデータを含むデータベースがあります。場合によっては、テーブルにロックが発生することがあります。そのため、dbml クラスにコミットされていない読み取りの分離レベルを適用する必要があります (この分離レベルにはいくつかの欠点があることがわかっています)。

私は部分クラスとしてdbmlファイルのコードの下にアップルを持っています

partial class MainDataContext
{
  public MainDataContext()
  {
      base.Connection.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted);
  } 
}

実装する適切な方法ですか?またはそれについて半分の提案をしてください。

ありがとう

4

2 に答える 2

5

その場合、その接続のすべてのコマンドにトランザクションをアタッチする必要がありますが、これは LINQ-to-SQL が行うことではありません (ただし、トランザクション インスタンスについて認識させる方法はあります)。おそらく1つのオプションは、接続を受け入れるオーバーロードを使用し、次の方法で分離レベルをすでに踏み込んだ、すでに開いている接続を単に提供することです。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

もちろん、それを行う場合は、完了したら接続を適切に破棄するのがあなたの仕事です。LINQ-to-SQL は、接続の有効期間を管理していると想定します。

LINQ-to-SQL データ コンテキストのもう 1 つのオプションは、ExecuteQuery<T>(sql, args)メソッドを使用することです。これにより、独自の生の TSQL を渡すことができます。これは明らかに、実際にはLINQを使用していないことを意味しますが、NOLOCKetc を戦術的に意味のある場所はほとんどありません(マテリアライザーにデータコンテキストを使用するだけです)。これはより粒度が高く、高スループット/高同時実行テーブルに集中できます。

于 2013-02-11T12:20:24.413 に答える
3

データベースと対話するコードをTransactionScopeブロックに配置し、TransactionScope に必要な分離レベルを設定できます。

TransactionOptions _transactionOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.Snapshot };
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, _transactionOptions))
{
 //your code here
}

そしてもちろん、これをさらに一歩進めると、transactionScope の作成を静的な Factory のようなメソッドにカプセル化できるため、必要な場所で簡単に作成でき、分離レベルを変更する必要がある場合は、変更する場所が 1 つだけになります。それ。要件に応じて、最適なものを選択してください。

于 2013-02-11T12:37:17.360 に答える