我将 NHibernate 与 MySql.Data ADO 连接器一起使用。
我有带有 CRUD 方法的 Dao 类:创建、更新、删除。
这些方法打开它们自己的 NHibernate 事务并提交它们。
现在我正在改变我的设计以使用工作单元模式。会话和事务将在上层打开和提交,而不是在 Dao 方法中。所以我必须从 Dao 类中删除提交。
我发现这种方法存在几个问题:
- 我在 commit() 点捕获了数据库特定的异常。现在提交是在上面的一层中完成的。所以我必须将所有数据库层特定的代码添加到外层?诸如捕获 FK 违规或 NH 特定异常之类的事情。
- 我将同时获取所有可能的异常,必须辨别它们来自哪个具体的 Dao 类,并实现代码来处理它们。
- 如果其中一个步骤失败,我将无法中止操作,因为在最终提交完成之前我不会知道。我知道事务回滚会防止数据不一致,但是仅仅因为我不知道前面的行导致了错误,运行以下所有代码似乎是一种性能浪费。
我不喜欢这种连续性。我希望我可以在事务范围内使用嵌套事务,所以我可以在本地进行提交,但似乎 MySql.Data 连接器不支持它们。我试过了,我得到了例外:
System.InvalidOperationException:不支持嵌套事务
是否有任何解决方法可以让我在插入、更新或删除操作完成时获得可能的异常?session.Flush() 会这样做吗?或者有什么方法可以将 TransactionScope 与 MySql.Data 一起使用?
抱歉,如果这个问题看起来很幼稚,但我已经搜索了一段时间,但没有找到任何明确的解决方案。关于事务范围不适用于 MySql.Data,我得到的所有信息似乎都有些陈旧,我不确定现在是否真的无法完成。