Entity Framework with NOLOCK
6895 ワード
SqlServerでは、同じデータベース・テーブルで頻繁に読み書きを同時に行う場合、ロックの問題があります.つまり、前のinsert、update、deleteトランザクションの操作が完了する前に、読み取ることができません.操作が完了するまで待たなければなりません.select操作を行うことはできません.同時操作を防止するために汚いデータを読むことを目的としています.SQL文では、このような状況を許容し、クエリーの速度を速めることができます.クエリのロックは無視できます.
改善して、もしプロジェクトの中で多くの地方がnolockクエリーを必要とするならば、このコードは絶えずコピーする必要があります.この時、パッケージを行うことを考慮する必要があります.明らかに、外層コードは簡単に抽出することができますが、中のコードセグメントは不確定で、パッケージすれば、実行する時、コードの断片を送る必要があります.依頼はこのような状況で役に立ちます.依頼を使って改善することができます.すなわち,データベースをクエリする際の論理コード代は依頼から伝達される.
Actionというマイクロソフトの高度パッケージの依頼の書き方に慣れていない場合(その本質は依頼です)、元の依頼の書き方を引き続き見ることができます.△私個人的には、マイクロソフトは高度なパッケージを作るのが好きで、プログラマーにプログラミングの効率を高めたいと思っていますが、初心者のプログラマーはその原理を知らないので、使うだけなので、本当に私たちの民工になっています.だから、私たちは仕事の勉強の過程で、使うために使わないで、その本質を多く検討して、自分の向上に役立ちます.
呼び出しも簡単です
この匿名関数の書き方に慣れていなければ、全部書きます.
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