2011-04-11 77 views
3

我有一個實體有多個字段。可以對其執行兩種類型的操作:通常由用戶啓動的較長操作,以及由系統定期運行的較短操作。這兩個都更新了實體,但它們涉及不同的領域。NHibernate:修改兩個會話中的實體的不同字段

不能有兩個併發的長操作或兩個併發的短操作。但系統可能會在長時間的操作正在進行時安排短暫的操作,並且這兩者應該同時執行。由於它們涉及不同的領域,我相信這應該是可能的。我認爲NHibernate的變更跟蹤應該在這裏做 - 即,如果一個會話加載一個實體並更新一些字段,而另一個會話加載相同的實體並更新不同的字段,則兩者不會相互衝突。不過,我覺得我不應該依賴這個,因爲它聽起來像是一個「優化」或「實現細節」。我傾向於將更改跟蹤視爲優化來減少數據庫流量,我不希望系統的功能依賴於它。另外,如果我決定實現這個實體的樂觀併發性,那麼我冒險得到一個StaleObjectException,儘管我可以保證沒有實際的碰撞。

什麼是最好的方法來實現這一目標?我應該將實體分成兩個嗎?這不會影響數據庫的一致性(例如,如果實體中只有一個「一半」在DB中)?我可以使用NHibernate顯式設置一個實體的單個字段嗎?我不想依賴變更追蹤來實現功能嗎?

如果它很重要,我使用流利的NHibernate。

回答

2

您可以使用dynamic update來映射實體。

  • dynamic-update(可選,默認爲false):指定UPDATE SQL應該在運行時生成並且只包含那些值已更改的列。

如果啓用了動態更新,您將有樂觀鎖定的策略選擇:

  • version檢查version/timestamp字段
  • all檢查所有列
  • dirty檢查的改變列
  • none不使用樂觀鎖定

更多信息here

+0

感謝您的建議。但是,這仍然不依賴於追蹤「優化」的變化嗎?我擔心的是,我始終認爲變更跟蹤是爲了優化目的而減少數據庫查詢的一種方式。我得到這種依賴於功能要求的不舒服感(即允許兩個操作同時運行)。難道它是更明確的(因此不太可能因意外更改而中斷)來分離這兩個操作的數據? – telewin 2011-04-13 06:31:00

+0

@telewin我仍然看不到分離實體的好處。動態更新只會更新已更改的屬性,而不管其中的更改是什麼,並且根據您的模型,兩種操作都不會與其他工作重疊,但我仍然沒有看到問題。 :) – rebelliard 2011-04-13 12:07:05

+0

我擔心的是人(即,其他開發人員)可能會將更改跟蹤視爲優化,這意味着它可以在不影響功能的情況下關閉。如果您將鎖定策略從「髒」更改爲「版本」,並且事情停止工作,它會不會讓您感到驚訝?分離實體將防止發生。或者你是否認爲鎖定策略應該被視爲功能的一部分,所以這是可以接受的?當然,樂觀和悲觀鎖定之間的選擇是功能的一部分(影響例外等)。 – telewin 2011-04-13 12:29:41

相關問題