2010-07-27 91 views
8

我正在閱讀關於hibernate樂觀鎖定的以下博客。我打算在冬眠時使用它。但是,我有一個問題。我們有java代碼和C++代碼,都連接到一個數據庫。雖然,java代碼可以使用hibernate來實現樂觀鎖定,但我想讓C++代碼做同樣的事情。此外,C++代碼正在使用一些遺留代碼。Hibernate樂觀鎖定..如何工作?

http://turgaykivrak.wordpress.com/2009/05/16/72/

是否有解釋休眠如何實現樂觀鎖定一個文檔?

任何建議表示讚賞。

謝謝
巴拉

回答

11

準確地說,你不是說樂觀鎖定,但樂觀併發(無鎖)。 爲版本使用時間戳僅用於遺留數據庫支持,因爲現代數據庫可以(至少在理論上)以比存儲時間戳的準確性更快的速度工作。

使用整數版本屬性很簡單:

  • 在INSERT:集版本1
  • 在更新和刪除:增加版本1和追加 「其中version = @版本」,以每個SQL statementent。返回更改的記錄數。當更改記錄的數量與預期不同時,拋出StaleObjectStateException。

就個人而言,我不會創建兩個單獨的應用程序寫在一個非傳統的情況相同的數據,因爲這意味着商業邏輯必須被複制和變化都被應用到兩個應用程序,還可以當變化僅與其中一個應用程序相關。

+0

謝謝@Paco。我可以在mysql中使用bigint而不是整數。 – Boolean 2010-07-27 21:07:08

+1

這對於MySQL來說是正確的,這是問題所在,但如果您使用的是SQL Server,則TimeStamp是首選。另見http://ayende.com/Blog/archive/2009/04/15/nhibernate-mapping-concurrency.aspx。 – 2010-07-27 21:42:09

+0

我沒有與MySQL結合的NHibernate版本屬性的經驗。我想你可以通過在版本屬性映射中指定long類型來將mysql bigint映射到java long。 – Paco 2010-07-27 21:48:17