我想了解實體框架是如何工作的。我知道EF SaveChanges基本上是一個事務性更新的包裝。我也明白,如果需要,你可以在TransactionScope中包裝兩個上下文。庫存系統的實體框架交易
我正在使用Code First方法。
我不明白什麼是我會怎麼做像
UPDATE Inventory SET Available = Available - 1 WHERE Available > 0
更新換句話說 - 如何確保至少有X可用庫存做更新之前?
我想我可以編寫代碼,着眼於商品的庫存,並驗證有足夠的庫存來完成購買:
if (Product.Inventory - quantityToPurchase < 0) throw new Exception(..)
但是,我們在方案中,其中兩個客戶試圖在買同一時間和從數據庫中爲每個客戶提取的對象聲稱在庫存中有2個項目?我上面的邏輯無法理解。
如何確保SaveChanges()方法僅提交對象IF和ONLY的更改如果(Available - quantity)
大於0?
我很高興你知道你在做什麼,並將其發佈在這裏!我不確定這個問題是否是一個「併發」問題,但是我確實知道如何使用與併發管理相同的技術來解決它。無論哪種方式,感謝張貼這個B/C我學到了一些東西。 – kingdango
它是一個併發問題,因爲我不希望兩個用戶同時更新清單行,從而允許超額清點庫存。由於EF首先從數據庫加載數據,然後將其寫回,因此兩個用戶可能同時加載數據的機會是「我們有2件襯衫庫存」,然後都嘗試寫回同一行這表明他們每人都購買了2件襯衫。這意味着我現在已經超賣了襯衫。上面的方法通過確保您寫入的行沒有被讀取後被修改,從而避免了這種情況。 –
是的,這很有道理,謝謝你的描述。 – kingdango