2013-06-19 35 views
0

假設我有一個傳統銷售/庫存系統,其中包含具有數量屬性的庫存對象。在繁忙系統中保存數量字段的一般指導

如果我使用類似NHibernate的東西來將我的對象的狀態保存到數據庫中,那麼在一個繁忙的系統中,從NHibernate從數據庫加載對象的時間開始,將數量設置爲5有人可能在系統中收到採購訂單並將數量更新爲10?

因此,當我的代碼從銷售該項目中扣除數量時,我可能將數量設置爲4而不是9?

那豈不是更安全的發佈更新,以剛說,數據庫,無論數量目前是,減1

似乎這不是一個對象模型場景合身雖然。

有沒有人需要處理這類問題?

謝謝

+0

您可能想要搜索如何處理NHibernate中的併發。可以生成並保持鎖定,以確保每個操作都按正確的順序執行。 – tucaz

回答

1

你會想要在事務中包裝你的讀寫。這正是他們設計要防止的問題,許多ORM暴露了開始和結束事務的能力。

與任何抽象一樣,總是存在效率問題。有可能ORM不會生成與UPDATE count = count - 1 FROM products WHERE product.id = 1 AND product.count > 1一樣高效的SQL查詢,這不需要事務。

+0

這是有道理的,如果你的用戶界面加載正在使用的實體,在讀取和寫入之間不會有一段時間?我想在保存時可以再次讀取對象以獲取它的當前狀態? – Jeremie

+0

假設你有一個網頁,可以讓你查看當前的物品數量,並且有一個數字字段和一個可以通過#減少數量的按鈕。當你向用戶顯示頁面時,你加載數量,不需要事務,因爲這是一個讀取。當用戶在字段中輸入內容並點擊#時,您將對網頁有新的「請求」,因此您使用帶有事務的ORM進行讀/寫操作,或者直接發出我展示的查詢。然後,您會監聽事務或查詢失敗,並在響應中告知用戶 - 這意味着自生成頁面以來計數發生了變化。 – Idles

+0

謝謝,這很有道理! – Jeremie