Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
工作单元的副作用可以通过TransactionScope修复,但MySql.Data无法修复_Mysql_Nhibernate_Ado.net_Transactionscope_Unit Of Work - Fatal编程技术网

工作单元的副作用可以通过TransactionScope修复,但MySql.Data无法修复

工作单元的副作用可以通过TransactionScope修复,但MySql.Data无法修复,mysql,nhibernate,ado.net,transactionscope,unit-of-work,Mysql,Nhibernate,Ado.net,Transactionscope,Unit Of Work,我将NHibernate与MySql.Data ADO连接器一起使用 我有带有CRUD方法的Dao类:创建、更新、删除 这些方法打开自己的NHibernate事务并提交它们 现在我将我的设计更改为使用工作单元模式。会话和事务将在上层打开和提交,而不是在Dao方法中。因此,我必须从Dao类中删除提交 我发现这种方法有几个问题: 我在提交点捕获特定于数据库的异常。现在提交在上面的一层中完成。所以我必须将所有特定于数据库层的代码添加到外层?例如捕获FK冲突或NH特定异常。 我将同时获得所有可能的异常,

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

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

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

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

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

我在提交点捕获特定于数据库的异常。现在提交在上面的一层中完成。所以我必须将所有特定于数据库层的代码添加到外层?例如捕获FK冲突或NH特定异常。 我将同时获得所有可能的异常,必须识别它们来自哪个具体的Dao类,并实现代码来处理它们。 如果其中一个步骤失败,我将无法中止操作,因为在完成最终提交之前,我不会知道它。我知道事务回滚将防止数据不一致,但仅仅因为我不知道前几行导致了错误,就运行以下所有代码似乎是一种性能浪费。 我不喜欢这种仪式。我希望我可以在事务作用域中使用嵌套事务,这样我就可以在本地进行提交,但是看起来MySql.Data connector不支持它们。我试过了,但有例外:

System.InvalidOperationException:嵌套事务不可用 支持

是否有任何变通方法可以让我在插入、更新或删除操作完成时立即获得可能的异常?我能帮你吗?或者有没有办法将TransactionScope用于MySql.Data

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

最后,我决定在任何时候使用嵌套事务提交时都使用Flush。它似乎工作正常,我在那一刻得到的例外,我能够处理他们当地

我知道NHibernate的最佳实践包括不要如此随意地使用Flush,但我没有找到更好的解决方案,因为MySql和NHibernate不提供嵌套事务,所以这似乎是较小的缺点