मैं केवल एक टेबल पर लॉक स्टेटमेंट मैन्युअल रूप से जारी करके इसे वास्तव में पूरा करने में सक्षम था। यह एक पूर्ण करता है टेबल लॉक, इसलिए इससे सावधान रहें! मेरे मामले में यह एक कतार बनाने के लिए उपयोगी था जिसे मैं एक साथ कई प्रक्रियाओं को छूना नहीं चाहता था।
using (Entities entities = new Entities())
using (TransactionScope scope = new TransactionScope())
{
//Lock the table during this transaction
entities.Database.ExecuteSqlCommand("SELECT TOP 1 KeyColumn FROM MyTable WITH (TABLOCKX, HOLDLOCK)");
//Do your work with the locked table here...
//Complete the scope here to commit, otherwise it will rollback
//The table lock will be released after we exit the TransactionScope block
scope.Complete();
}
अपडेट करें - एंटिटी फ्रेमवर्क 6 में, विशेष रूप से async
. के साथ / await
कोड, आपको लेनदेन को अलग तरीके से संभालने की आवश्यकता है। कुछ रूपांतरणों के बाद यह हमारे लिए क्रैश हो रहा था।
using (Entities entities = new Entities())
using (DbContextTransaction scope = entities.Database.BeginTransaction())
{
//Lock the table during this transaction
entities.Database.ExecuteSqlCommand("SELECT TOP 1 KeyColumn FROM MyTable WITH (TABLOCKX, HOLDLOCK)");
//Do your work with the locked table here...
//Complete the scope here to commit, otherwise it will rollback
//The table lock will be released after we exit the TransactionScope block
scope.Commit();
}