2011-01-06 28 views
0

讓我解釋一下我的情況...NHibernate的與SELECT FOR SHARE在PostgreSQL的

說我有兩個表:「路徑」和「包」 路徑表是由「PATHID」「的StartNode」 ,「EndNode」 軟件包表由「StartNode」,「DestinationNode」,「路徑」

我打算編寫一個程序,它使用任何最短路徑算法計算從開始到目的地的路徑。

爲了確保路徑設置不會在我計算路徑時發生變化,我相信我應該使用「SELECT * FROM Paths FOR SHARE」來獲取共享鎖。因此,直到路徑被計算並且事務被提交之前,路徑開始/結束必須不被改變,並且在任何時刻 - 數據庫中計算的路徑總是有效的。

問題是:我正在用NHibernate編寫C#程序,我如何獲得共享鎖? 我曾嘗試過:

Session.QueryOver<Path>().Lock().Read.List() 

但它並沒有做到這一點。

Session.CreateSQLQuery()唯一的解決方案?

回答

1

據我所知NHibernate目前不支持SELECT ... FOR SHARE,但它確實支持FOR UPDATE和FOR UPDATE NOWAIT(請參閱lock modes),這當然是更嚴格的,但它會起作用。

由於NHibernate是一個開源項目,你可以suggest this enhancement當然實現它。

+0

我不認爲樂觀鎖定的作品。爲了簡單起見,我們假設Packages.Paths是一對多映射到Paths.PathId。然而,由於我沒有修改Path對象本身,而只是引用它,所以樂觀鎖定不會啓動。 – HelloSam 2011-01-06 06:37:21

+0

@HelloSam:你是對的,我更新了我的答案。 – 2011-01-06 06:42:11