Entity Framework with NOLOCK

6895 ワード

SqlServerでは、同じデータベース・テーブルで頻繁に読み書きを同時に行う場合、ロックの問題があります.つまり、前のinsert、update、deleteトランザクションの操作が完了する前に、読み取ることができません.操作が完了するまで待たなければなりません.select操作を行うことはできません.同時操作を防止するために汚いデータを読むことを目的としています.SQL文では、このような状況を許容し、クエリーの速度を速めることができます.クエリのロックは無視できます.
select * from [User] with(nolock) 

EntityFramework, nolock : System.Transactions


//declare the transaction options
var transactionOptions = new System.Transactions.TransactionOptions(); //set it to read uncommited
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; //create the transaction scope, passing our options in
using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions)) { //declare our context
    using (var context = new MyEntityConnection()) { //any reads we do here will also read uncomitted data //... //...
 } //don't forget to complete the transaction scope
 transactionScope.Complete(); }

改善して、もしプロジェクトの中で多くの地方がnolockクエリーを必要とするならば、このコードは絶えずコピーする必要があります.この時、パッケージを行うことを考慮する必要があります.明らかに、外層コードは簡単に抽出することができますが、中のコードセグメントは不確定で、パッケージすれば、実行する時、コードの断片を送る必要があります.依頼はこのような状況で役に立ちます.依頼を使って改善することができます.すなわち,データベースをクエリする際の論理コード代は依頼から伝達される.
        public static void NoLockInvokeDB(Action action) { var transactionOptions = new System.Transactions.TransactionOptions(); transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions)) { try { action(); } finally { transactionScope.Complete(); } } }
NoLockInvokeDB(() =>
{ using (var db = new TicketDB()) { lst = db.User.ToList(); } });

Actionというマイクロソフトの高度パッケージの依頼の書き方に慣れていない場合(その本質は依頼です)、元の依頼の書き方を引き続き見ることができます.△私個人的には、マイクロソフトは高度なパッケージを作るのが好きで、プログラマーにプログラミングの効率を高めたいと思っていますが、初心者のプログラマーはその原理を知らないので、使うだけなので、本当に私たちの民工になっています.だから、私たちは仕事の勉強の過程で、使うために使わないで、その本質を多く検討して、自分の向上に役立ちます.
  public class Helper
    {
        public void NoLockInvokeDB(EFdelegate d)
        {
            var transactionOptions = new System.Transactions.TransactionOptions();
            transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
            using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
            {
                d();
                transactionScope.Complete();
            }
        }
    }
    public delegate void EFdelegate();

呼び出しも簡単です
 EFdelegate d = new EFdelegate(() => {
                // 
            });

この匿名関数の書き方に慣れていなければ、全部書きます.
protected void Page_Load(object sender, EventArgs e)
{
    EFdelegate d = new EFdelegate(SonFun);
}

public void SonFun()
{
 // 
}


http://stackoverflow.com/questions/926656/entity-framework-with-nolock