mysql - 工作单元的副作用可以用 TransactionScope 修复,但不适用于 MySql.Data

标签 mysql nhibernate ado.net transactionscope unit-of-work

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

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

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

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

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

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

我不喜欢这种后果。我希望我可以在事务范围内使用嵌套事务,这样我就可以在本地进行提交,但似乎 MySql.Data 连接器不支持它们。我试过了,但有异常(exception):

System.InvalidOperationException : Nested transactions are not supported

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

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

最佳答案

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

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

关于mysql - 工作单元的副作用可以用 TransactionScope 修复,但不适用于 MySql.Data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17105966/

相关文章:

mysql - 存在一个关系的返回关系集?

nhibernate - NHibernate 3.2.GA 的城堡字节码提供程序会在 nuget 中提供吗?

c# - OS X 上的 Mono 与 MSVC 2010 同行兼容吗?

c# - SqlDataReader.Read 和 SqlDataReader.NextResult 之间的区别

c# - 调用带返回值的存储过程

c# - SqlConnection 池似乎不起作用

php - 如何从php函数返回mysql数据

MySQL无法连接来自具有不同数据类型的不同数据库的列

java - spring boot mysql jpa Command Line Runner问题

c# - 使用 NHibernate 管理单例实体的 session