2011-03-11 62 views
0

我正在構建一個小型Web應用程序,用戶被授予對項目進行評分的能力。 在我的應用程序中,我使用nhibernate和asp.net mvc。nhibernate沒有機會更新?

所有的評價請求都是由jquery(ajax/post)發送的。 當用戶投票一個項目時,我檢查該項目是否已被投票過。如果是這樣,我將最後的投票值更新爲收到的新投票值。如果不是,我只是給我的表添加一個新的評級。

我注意到了一些很奇怪的東西。這個效果很好,但是當我點擊幾次真的很快就會搞砸了。我得到了多個評級,看起來好像nhibernate並不會檢查用戶是否曾經投票過,而只是返回一個錯誤的值。

這可能嗎?我怎麼看到底下發生了什麼?

謝謝

回答

2

您可能有一個併發問題。我假設你每次點擊都會得到一個線程和事務。在並行事務中單擊非常快的結果,這些事務看不到別人在做什麼。

您有一個典型問題,即不在數據庫中的項目(新投票)不能被鎖定。

的解決方案是:

  • 使用lock避免同一用戶的多張選票被存儲在同一時間。當您在同一個數據庫上有多個服務器(或AppDomain)時,這不起作用,因爲該鎖僅限於AppDomain。
  • 在數據庫中使用表鎖來鎖定整個投票表,只有一個事務可以同時添加投票。
1

你打開了NHibernate日誌記錄嗎?

以下添加到hibernate.config.xml文件:

<property name="show_sql">true</property> 

產生可以在控制檯或測試運行輸出可以看到,如果你正在運行單元測試的SQL。您也可以配置log4net將NHibernate日誌信息寫入文件(請參閱https://web.archive.org/web/20110514164829/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/07/01/how-to-configure-log4net-for-use-with-nhibernate.aspx

最後,您如何使用NHibernate?你在使用存儲庫模式嗎?很難確定你的應用程序出了什麼問題而不知道代碼。

+0

是的,我正在使用存儲庫模式 – vondip 2011-03-11 08:48:51