【发布时间】:2010-08-26 15:50:04
【问题描述】:
首先,一些背景知识:我是 ASP.NET MVC 2 和 NHibernate 的新手。我正在启动我的第一个应用程序,我想使用 NHibernate,因为我来自 JSP + Struts 1 + Hibernate Web 应用程序。
似乎没有人在谈论这个,所以我想它一定很明显。我仍然摸不着头脑,因为我找不到完成以下事情的解决方案:
1) 我想使用“每个请求的会话”策略。因此,每次用户发出请求时,他都会获得一个 Nhibernate 会话,启动一个事务,当请求结束时,事务提交,并且 NHibernate 会话关闭(如果有,则返回到池中)。这保证了我的交易是原子的。
2) 当发生数据库异常(PK 违规、唯一违规等)时,我想捕获该异常,回滚我的事务并给用户一个明确的消息:如果是 PK 违规,那么该消息,同样存在所有完整性错误。
那么,我的问题是什么?我来自 Java World,在那里我使用过滤器打开会话、启动事务、处理请求,然后提交事务并关闭会话。这有效,除非发生数据库异常,并且当您在过滤器中时,由于响应已经提交,因此无法更改目标页面。
因此,当实际上事务已回滚时,用户会看到成功页面。为了避免这种情况,我必须在 Java 中编写大量数据完整性检查以防止所有完整性异常,因为我无法正确处理它们。这很糟糕,因为我正在做这项工作而不是将其留给数据库(或者我错了,我总是必须在我的应用程序中编写所有这些数据完整性代码?)。
所以我发现我猜的 IHttpModule 接口与 javax.servlet.Filter 的概念几乎相同(如果我错了,请纠正我),所以我猜我可能有同样的问题再次。
我应该将我的提交放在哪里以确保我的事务是原子的,并且当它们抛出异常时,我可以捕获它们并更改我的目标页面并向用户提供全面的消息?
到目前为止,我想出的唯一可能的解决方案是让我的 IHttpModule 启动和关闭事务,并将提交调用放在我的控制器方法的最后一行,从而能够在那里捕获异常然后返回带有消息的适当视图。现在我必须将那些提交和异常处理行复制到我所有需要提交的控制器方法中。还有关注点分离问题,我的控制器必须了解 DB,我一点也不喜欢。
有没有更好的办法?
【问题讨论】:
标签: nhibernate asp.net-mvc-2 transactions commit