1

我将 NHibernate 与 MySql.Data ADO 连接器一起使用。

我有带有 CRUD 方法的 Dao 类:创建、更新、删除。

这些方法打开它们自己的 NHibernate 事务并提交它们。

现在我正在改变我的设计以使用工作单元模式。会话和事务将在上层打开和提交,而不是在 Dao 方法中。所以我必须从 Dao 类中删除提交。

我发现这种方法存在几个问题:

  • 我在 commit() 点捕获了数据库特定的异常。现在提交是在上面的一层中完成的。所以我必须将所有数据库层特定的代码添加到外层?诸如捕获 FK 违规或 NH 特定异常之类的事情。
  • 我将同时获取所有可能的异常,必须辨别它们来自哪个具体的 Dao 类,并实现代码来处理它们。
  • 如果其中一个步骤失败,我将无法中止操作,因为在最终提交完成之前我不会知道。我知道事务回滚会防止数据不一致,但是仅仅因为我不知道前面的行导致了错误,运行以下所有代码似乎是一种性能浪费。

我不喜欢这种连续性。我希望我可以在事务范围内使用嵌套事务,所以我可以在本地进行提交,但似乎 MySql.Data 连接器不支持它们。我试过了,我得到了例外:

System.InvalidOperationException:不支持嵌套事务

是否有任何解决方法可以让我在插入、更新或删除操作完成时获得可能的异常?session.Flush() 会这样做吗?或者有什么方法可以将 TransactionScope 与 MySql.Data 一起使用?

抱歉,如果这个问题看起来很幼稚,但我已经搜索了一段时间,但没有找到任何明确的解决方案。关于事务范围不适用于 MySql.Data,我得到的所有信息似乎都有些陈旧,我不确定现在是否真的无法完成。

4

1 回答 1

0

最后我决定使用Flush()任何我会使用嵌套事务的时间Commit()。它似乎工作正常,我在那一刻得到了异常,我能够在本地处理它们。

我知道 NHibernate 的最佳实践包括不要如此随意地使用 Flush() ,但我没有找到更好的解决方案,因为嵌套事务不适用于MySqland NHibernate,所以这似乎是较小的邪恶。

于 2013-09-07T11:52:08.440 回答