2012-02-08 39 views
0

我有一個相對簡單的問題,我不能解決沒有很多醜陋的解決方法。基本上,我正在開發支付網關客戶端,其過程是網站通知付款服務器要完成的付款,客戶端轉移到付款服務器,並且一旦付款完成,付款服務器通知網站一個單獨的線程付款已完成,並重定向客戶。現在,在收到付款通知之前,客戶可以在網站上「收到」。因此,我需要對系統進行編程,以等待直到收到通知或最多30秒。等待項目被標記爲由不同的線程支付,使用nhibernate

收到通知後,Order實體標記爲「付費」。問題是這樣的:

  • 客戶端被重定向到網站之前,Order.Paid仍然false
  • 1後 - 5秒,接收通知和Order被標記爲true
  • 由於NHibernate的會話管理,客戶端在另一個線程上仍然看到Order.Paidfalse
  • 更糟的是,有時客戶的Order然後刷新End_Request,並且Order.Paid再次重置爲false

我試過的唯一辦法似乎有效,就是我在等待之前明確地處理了Nhibernate會話,然後不斷創建新的會話,直到它被發現爲付費。然而,問題在於原來的會話被刪除,所有已經加載的實體的延遲加載將停止工作併產生錯誤。

它在我看來很簡單,但由於會話管理,似乎很複雜,任何想法如何去做呢?

謝謝!

+0

誰收到通知?也爲什麼不能使用session.refresh()而不是創建新的會話? – Firo 2012-02-08 16:28:01

回答

0

從我發佈這個問題的時候起,我就設法找到了解決方案。基本上,NHibernate的工作原理 - 如果任何異常發生在一個會話上,該會話必須被處置。當使用樂觀併發時,這也適用於StaleObjectException。客戶仍然看到的原因是「未付款」是因爲會議沒有被處置。

在谷歌圖書的圖書段解釋對此進行了更詳細一點: http://books.google.com.mt/books?id=eMOYUycDaoUC&pg=PT213&lpg=PT213&dq=nhibernate+staleobjectexception+dispose&source=bl&ots=rg9YHt58gc&sig=W9FoTm8_4DT3PvMKGLrddG3lSxs&hl=en&sa=X&ei=FGp-UNr4FI7Vsga2nIDwBw&ved=0CGAQ6AEwCA