C# 等待使用nhibernate将项目标记为由其他线程支付

C# 等待使用nhibernate将项目标记为由其他线程支付,c#,database,multithreading,nhibernate,asynchronous,C#,Database,Multithreading,Nhibernate,Asynchronous,我有一个相对简单的问题,如果没有很多丑陋的变通办法,我无法解决这个问题。基本上,我正在开发一个支付网关客户端,其中的过程是网站通知支付服务器要完成的支付,客户端被转移到支付服务器,一旦支付完成,支付服务器在一个单独的线程上通知网站已完成支付,并重定向客户端。现在,客户可以在收到付款通知之前在网站上“收到”。因此,我需要对系统进行编程,使其等待直到收到通知,或者最多30秒 收到通知后,订单实体将标记为“已付款”。问题是: 客户端被重定向到之前的网站,订单。支付的仍然是false 1-5秒后,收到

我有一个相对简单的问题,如果没有很多丑陋的变通办法,我无法解决这个问题。基本上,我正在开发一个支付网关客户端,其中的过程是网站通知支付服务器要完成的支付,客户端被转移到支付服务器,一旦支付完成,支付服务器在一个单独的线程上通知网站已完成支付,并重定向客户端。现在,客户可以在收到付款通知之前在网站上“收到”。因此,我需要对系统进行编程,使其等待直到收到通知,或者最多30秒

收到通知后,
订单
实体将标记为“已付款”。问题是:

  • 客户端被重定向到之前的网站,
    订单。支付的
    仍然是
    false
  • 1-5秒后,收到通知,
    Order
    标记为
    true
  • 由于Nhibernate会话管理,客户端仍然会在另一个线程上看到
    Order.Paid
    false
  • 更糟糕的是,有时客户的
    订单
    会在
    结束请求
    时刷新,而
    订单.Paid
    会再次重置为
    false
我尝试的唯一可行的方法是在等待之前显式地处理Nhibernate会话,然后不断地创建一个新会话,直到发现它是付费的。然而,问题是,由于原始会话已被删除,因此对任何在手动之前已加载的实体的延迟加载将停止工作并生成错误

在我看来,这看起来很简单,但由于会话管理的原因,它似乎相当复杂,有什么办法吗


谢谢

从我发帖的时候起,我就设法找到了解决这个问题的办法

基本上,NHibernate是如何工作的——如果会话上发生任何异常,则必须处理该会话。这也适用于使用乐观并发时的
StaleObjectException
。客户端仍然看到“未付款”的原因是会话未被处理

谷歌图书(Google Books)上的一个图书片段更详细地解释了这一点:

谁收到通知?还有,为什么不能使用session.refresh()而不是创建新会话?