2011-06-14 30 views
0

我有一個使用LinqToSql的多線程應用程序。有一個問題我需要做的事情是爲搶一幫行代表一個線程,例如:Linq中的事務邊界在運行查詢後鎖定表?

dataContext.Connection.BeginTransaction() 
var available = MyThings.Where(t => t.IsAvailable).Take(numberToTake); 
// other validation stuff happens here, then: 
foreach (var t in available) { 
    t.IsAvailable = false; 
    t.GrabbedBy = this; 
    dataContext.SubmitChanges(); 
} 
dataContext.Connection.CommitTransaction(); 

麻煩的是,在第2行該查詢似乎沒有鎖定MyThings表,因爲其他線程似乎能夠抓住這個線程抓取的相同行,這顯然不是一件好事。我不能在這個塊上放置代碼鎖,因爲不同的線程可能在不同的內存空間運行,甚至可能在不同的計算機上運行。但我確實需要能夠使用數據庫級事務邊界來鎖定這些行,以防止其他人在我進行驗證時抓取它們。

有沒有什麼內置的方式來做到這一點與LinqToSql,短暫的這些行「虛擬」更新,以鞏固我在交易邊界抓住他們?

回答