NOLOCK
সত্তা ফ্রেমওয়ার্কে আমি কীভাবে এই ফাংশনটি ব্যবহার করতে পারি ? এক্সএমএল এটি করার একমাত্র উপায়?
NOLOCK
সত্তা ফ্রেমওয়ার্কে আমি কীভাবে এই ফাংশনটি ব্যবহার করতে পারি ? এক্সএমএল এটি করার একমাত্র উপায়?
উত্তর:
না, তবে আপনি কোনও লেনদেন শুরু করতে পারেন এবং নিরীক্ষণ করতে পড়ার জন্য বিচ্ছিন্নতা স্তর নির্ধারণ করতে পারেন । এটি মূলত NOLOCK হিসাবে একই কাজ করে, তবে এটি প্রতি টেবিলের ভিত্তিতে না করে বরং লেনদেনের আওতায় থাকা সমস্ত কিছুর জন্য এটি করবে।
যদি আপনি যা চান তা যদি মনে হয়, আপনি কীভাবে এটি চালিয়ে যেতে পারেন তা এখানে রয়েছে ...
//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();
}
এক্সটেনশন পদ্ধতিগুলি এটিকে আরও সহজ করে তুলতে পারে
public static List<T> ToListReadUncommitted<T>(this IQueryable<T> query)
{
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() {
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
List<T> toReturn = query.ToList();
scope.Complete();
return toReturn;
}
}
public static int CountReadUncommitted<T>(this IQueryable<T> query)
{
using (var scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions() {
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
int toReturn = query.Count();
scope.Complete();
return toReturn;
}
}
আপনার যদি বৃহত্তর কিছু প্রয়োজন হয় তবে সর্বোত্তম উপায় যা আমরা খুঁজে পেয়েছি যা প্রকৃতপক্ষে প্রতিবার একটি লেনদেনকোপ শুরু করার চেয়ে কম অন্তর্নিহিত, এই সাধারণ কমান্ডটি চালিয়ে আপনি নিজের অবজেক্ট প্রসঙ্গটি তৈরি করার পরে কেবল আপনার সংযোগের উপর ডিফল্ট লেনদেনের বিচ্ছিন্নতা স্তর নির্ধারণ করতে পারেন:
this.context.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
http://msdn.microsoft.com/en-us/library/aa259216(v=sql.80).aspx
এই কৌশলটির সাহায্যে আমরা একটি সাধারণ ইএফ সরবরাহকারী তৈরি করতে সক্ষম হয়েছি যা আমাদের জন্য প্রসঙ্গ তৈরি করে এবং প্রকৃতপক্ষে আমাদের সমস্ত প্রসঙ্গে প্রতিটি সময় এই কমান্ডটি চালায় যাতে আমরা সর্বদা ডিফল্টরূপে "পড়াশোনাবিহীন" থাকি।
Transactions running at the READ UNCOMMITTED level do not issue shared locks
। এর থেকে বোঝা যায় যে সুবিধাটি পেতে আপনার অবশ্যই কোনও লেনদেনের মধ্যে চলছে। ( এমএসডিএন.মাইক্রোসফটকম /en-gb/library/ms173763.aspx থেকে নেওয়া )। আপনার পন্থাটি কম অনুপ্রবেশকারী হতে পারে তবে আপনি কোনও লেনদেন ব্যবহার না করলে এটি কোনও কিছুই অর্জন করতে পারে না।
SET TRANSACTION ISOLATION LEVEL...
কমান্ড একটি সংযোগ-স্তরের সম্পত্তি প্রভাবিত করে এবং যদি না একটি ক্যোয়ারী ইঙ্গিতটি দ্বারা অধিলিখিত অত: পর, সমস্ত এসকিউএল সেই মুহূর্তের পর (যে সংযোগের জন্য) থেকে বিবৃতি প্রভাবিত করে। এই আচরণটি কমপক্ষে এসকিউএল সার্ভার 2000 সাল থেকে এবং সম্ভবত এর আগে থেকেই হয়েছিল।
CREATE TABLE ##Test(Col1 INT); BEGIN TRAN; SELECT * FROM ##Test WITH (TABLOCK, XLOCK);
। এক প্রশ্নের (# 2) এবং রান খুলুন: SELECT * FROM ##Test;
। নির্বাচনটি টিবি # 1 এ এখনও খোলা লেনদেনের দ্বারা অবরুদ্ধ করা হওয়ায় নির্বাচনটি ফিরে আসবে না যা একচেটিয়া লক ব্যবহার করছে। # 2 এ নির্বাচন বাতিল করুন। SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
ট্যাব # 2 এ একবার চালান । ট্যাব # 2 এ আবার নির্বাচন করুন এবং এটি ফিরে আসবে। ROLLBACK
ট্যাব # 1 এ চালানোর বিষয়ে নিশ্চিত হন ।
যদিও আমি একেবারে সম্মত হয়েছি যে রিড আনমনমিটেড লেনদেনের বিচ্ছিন্নতা স্তরটি ব্যবহার করা সেরা পছন্দ, তবে কিছু সময় আপনি ম্যানেজার বা ক্লায়েন্টের অনুরোধে NOLOCK ইঙ্গিত ব্যবহার করতে বাধ্য হন এবং এই স্বীকৃত হওয়ার বিরুদ্ধে কোনও কারণ নেই।
সত্তা ফ্রেমওয়ার্ক 6 এর মাধ্যমে আপনি নিজের ডিবিকম্যান্ডইন্টারসেপ্টারটি এর মতো প্রয়োগ করতে পারেন:
public class NoLockInterceptor : DbCommandInterceptor
{
private static readonly Regex _tableAliasRegex =
new Regex(@"(?<tableAlias>AS \[Extent\d+\](?! WITH \(NOLOCK\)))",
RegexOptions.Multiline | RegexOptions.IgnoreCase);
[ThreadStatic]
public static bool SuppressNoLock;
public override void ScalarExecuting(DbCommand command,
DbCommandInterceptionContext<object> interceptionContext)
{
if (!SuppressNoLock)
{
command.CommandText =
_tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)");
}
}
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
if (!SuppressNoLock)
{
command.CommandText =
_tableAliasRegex.Replace(command.CommandText, "${tableAlias} WITH (NOLOCK)");
}
}
}
এই শ্রেণীর জায়গায়, আপনি আবেদন শুরুতে এটি প্রয়োগ করতে পারেন:
DbInterception.Add(new NoLockInterceptor());
এবং শর্তাধীনভাবে NOLOCK
বর্তমান থ্রেডের অনুসন্ধানগুলিতে ইঙ্গিত যুক্ত করা বন্ধ করুন :
NoLockInterceptor.SuppressNoLock = true;
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { if (!SuppressNoLock) command.CommandText = $"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;{Environment.NewLine}{command.CommandText}"; base.ReaderExecuting(command, interceptionContext); }
উপর উন্নত ডক্টর জোন্স 'র গৃহীত উত্তর এবং ব্যবহার PostSharp ;
প্রথম " ReadUncommitedTransactionSopopeAttribute "
[Serializable]
public class ReadUncommitedTransactionScopeAttribute : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs args)
{
//declare the transaction options
var transactionOptions = new TransactionOptions();
//set it to read uncommited
transactionOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
//create the transaction scope, passing our options in
using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
//declare our context
using (var scope = new TransactionScope())
{
args.Proceed();
scope.Complete();
}
}
}
}
তারপরে যখনই আপনার এটির প্রয়োজন হবে,
[ReadUncommitedTransactionScope()]
public static SomeEntities[] GetSomeEntities()
{
using (var context = new MyEntityConnection())
{
//any reads we do here will also read uncomitted data
//...
//...
}
}
ইন্টারসেপ্টারের সাথে "NOLOCK" যুক্ত করতে সক্ষম হওয়া খুব ভাল তবে ওরাকলের মতো অন্যান্য ডাটাবেস সিস্টেমে সংযোগ করার সময় কাজ করবে না।
এটিকে ঘিরে ধরতে আমি ডাটাবেসে একটি ভিউ তৈরি করি এবং ভিউয়ের ক্যোয়ারিতে নোলক প্রয়োগ করি। আমি তখন ভিএফটিকে ইএফের মধ্যে একটি টেবিল হিসাবে দেখি।
EF6 প্রবর্তনের সাথে সাথে মাইক্রোসফ্ট বিগিনট্রান্সজেকশন () পদ্ধতি ব্যবহার করার পরামর্শ দেয়।
আপনি ইএফ 6 + এবং ইএফ কোরে লেনদেনের পরিবর্তে বিগ্রেট ট্রান্সজেকশন ব্যবহার করতে পারেন
using (var ctx = new ContractDbContext())
using (var transaction = ctx.Database.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
{
//any reads we do here will also read uncommitted data
}
না, সত্যই নয় - সত্তা ফ্রেমওয়ার্কটি মূলত আপনার আসল ডাটাবেসের উপরে একটি বেশ কড়া স্তর। আপনার প্রশ্নগুলি ইএসকিউএল - সত্তা এসকিউএল - যা আপনার সত্তার মডেলটির দিকে প্রথম লক্ষ্যযুক্ত, এবং যেহেতু ইএফ একাধিক ডাটাবেস ব্যাকেন্ডকে সমর্থন করে তাই আপনি সরাসরি "নেটিভ" এসকিউএল সরাসরি আপনার ব্যাকএন্ডে প্রেরণ করতে পারবেন না ulated
নোকল ক্যোয়ারী ইঙ্গিতটি একটি এসকিউএল সার্ভার নির্দিষ্ট জিনিস এবং এটি অন্য কোনও সমর্থিত ডাটাবেসগুলিতে কাজ করবে না (যদি না তারা একই ইঙ্গিতটি প্রয়োগ করে - তবে আমি দৃ strongly়ভাবে সন্দেহ করি)।
আঙ্গুরের ছিরড়া
Database.ExecuteSqlCommand()
বা ব্যবহার করে DbSet<T>.SqlQuery()
।
(NOLOCK)
- খারাপ অভ্যাসগুলি লাথি মারার জন্য দেখুন - সর্বত্র নোলক লাগানো - এটি সর্বত্র ব্যবহার করার জন্য প্রস্তাবিত নয় - একেবারে বিপরীত!