Tôi chỉ thực sự có thể thực hiện được điều này bằng cách đưa ra một câu lệnh khóa cho một bảng theo cách thủ công. Điều này thực hiện một hoàn thành khóa bàn, vì vậy hãy cẩn thận với nó! Trong trường hợp của tôi, nó rất hữu ích khi tạo một hàng đợi mà tôi không muốn nhiều quy trình chạm vào cùng một lúc.
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();
}
Cập nhật - Trong Entity Framework 6, đặc biệt là với async
/ await
mã, bạn cần phải xử lý các giao dịch khác nhau. Điều này đã xảy ra đối với chúng tôi sau một số chuyển đổi.
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();
}