修改數據在數據庫,假設當汽車被出售,它會設置IsSold = true
,記錄買家,使用讀鎖檢查時/在程序
,並知道如果車已經賣了,我用的是如果檢查:
var car = GetCarFromDb().Where(car=>car.Id=2);
if(!car.IsSold){
car.IsSold = true; car.Buyer = thisUserName;
DbSaveChanges();
}
現在有是兩個用戶做買入動作幾乎在同一時間,
和我想象下面的情況可能發生:
即車將被賣出兩次,這是一個問題。
是它可能使用與MSSQL C#時,會發生什麼?
如果可能的話,我想阻止它就像整個代碼塊中給汽車的數據讀鎖定和寫鎖定的唯一途徑:
GiveCarId2ReadLockWriteLock();
var car = GetCarFromDb().Where(car=>car.Id=2);
if(!car.IsSold){
car.IsSold = true; car.Buyer = thisUserName;
DbSaveChanges();
}
ReleaseCarId2ReadLockWriteLock();
因此,如果用戶1開始檢查汽車銷售, user2必須等到user1完成售車設置,那麼user2將總是得到IsSold = true
,即一輛車不會反覆出售給2個用戶。
如果是對的,那麼如何練習GiveCarId2ReadLockWriteLock();
?
或者有其他方法可以防止2個用戶購買同一輛車,當2個用戶差不多同時在不同的計算機/客戶端上發送購買請求嗎?
也許類似MVC,或使用存儲庫模式,或做一些特殊的技能來處理WebAPI中的一次請求,以便每個請求可以在前一個請求結束時進入onlty?
更新201710:
下面是一個Article in Entity Framework討論。
您使用的是ORM,如實體框架還是直接數據庫連接? –
實體框架沒問題。我suddnely想如果使用Entiyframework,也許我可以使用控制器的力量來處理一個請求一次,直到請求結束然後第二個請求可以進來,雖然我不知道練習細節 –
這個應用程序的網頁或桌面? –