簡體   English   中英

Linq to SQL:鎖定表條目

[英]Linq to SQL: Lock on table entry

我有幾個使用同一表的應用程序(.Net)實例。 在該應用程序開始在第三方系統中更新數據之后,每個應用程序實例都將數據庫表中的第一個條目從“待處理”更改為“正在處理”,並將條目的狀態(表中的其他行)更改為“正在處理”。 如何實現我的邏輯以確保第二個實例不會在同一時間獲得此“ Pending”條目? 我正在使用Linq To Sql方法,並希望避免在具有相同數據庫條目的數據庫中發生沖突。

首先,您需要獲取未鎖定的第一個條目,並將其鎖定以向其他實例發出信號,表明有人正在該實例上工作。 然后,在不相關的表上執行所需的操作,並在完成實例鎖定后解鎖。 總體代碼應如下所示:

var instance = db.Entities.FirstOrDefault(e => e.Status == "Pending");
instance.Status = "Processing";
// Save changes so the other clients can see that this row is locked
db.SaveChanges();
// Perform custom logic
// And mark the instance as finished
db.Table<Entity>().Attach(instance);
instance.Status = "Finished";
db.SaveChanges();

編輯

為了避免多個應用程序第一次獲得相同的實例,您需要將查詢包裝並更新為事務。 這樣,所有其他應用程序將在獲取結果之前等待事務提交:

Entity instance;
using(var scope = new TransactionScope())
{
    instance = db.Entities.FirstOrDefault(e => e.Status == "Pending");
    instance.Status = "Processing";
    db.SaveChanges();
    scope.Complete();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM