我正在构建一个小型Web应用程序,用户可以在该应用程序中对项目进行评级。 在我的应用程序中,我使用的是nhibernate和asp.net mvc。
所有评级请求均由jquery(ajax / post)发送。 当用户对某个项目进行投票时,我会检查该项目是否先前已被投票。如果是,我将最后的投票值更新为收到的新投票值。如果没有,我只是在我的桌子上添加一个新的评级。
我注意到一些非常奇怪的事情。这很好用,但是当我点击几次真的很快就会搞砸了。我得到了多个评级,似乎nhibernate不会费心检查用户之前是否已投票,只是返回错误值。
这可能吗?我怎么才能看到引擎盖下的内容?
谢谢
答案 0 :(得分:2)
您可能遇到并发问题。我假设您获得每次点击的线程和交易。单击非常快会导致并行事务无法看到其他人在做什么。
您遇到一个典型问题,即无法锁定数据库中的项目(新投票)。
解决方案是:
lock
以避免同时存储同一用户的多个投票。当您在同一数据库上有多个服务器(或AppDomains)时,这不起作用,因为锁定仅限于AppDomain。答案 1 :(得分: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的?您使用的是存储库模式吗?如果不了解代码,很难确定应用程序出了什么问题。