MySQL Connector / NET - 支持Mono下的事务

时间:2010-10-03 14:08:04

标签: mysql mono transactionscope

有没有人知道如何在Mono下运行MySQL事务?

我正在使用MySQL Connector / NET(通过Subsonic 3),它在Microsoft .NET下运行良好。最近我尝试在Ubuntu上使用Mono运行相同的站点并且它几乎可以工作 - 除了我似乎无法使事务正常工作。

阅读Mono / MySQL网站,并不清楚什么是支持和不支持。

原始问题是带有调用堆栈的NotImplementedExcetion,如下所示:

[System.NotImplementedException]: The requested feature is not implemented.

at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction) <0x00181> 
at MySql.Data.MySqlClient.MySqlConnection.Open () <0x00381> 
at SubSonic.DataProviders.DbDataProvider.CreateConnection (string) <0x00059> 
at SubSonic.DataProviders.DbDataProvider.CreateConnection () <0x00015>

在MySQL网站上有一些提及,这似乎指向Mono不支持使交易有效所需的基础设施。还有一个注释,即使用CommittableTransaction而不是TransactionScope时,事务处理正常。所以我试过了,但得到了同样的例外。

MySQL网站上的另一条评论建议使用MONO构建选项重建MySQL数据提供程序。我尝试了,网站现在可以使用,但交易没有被使用 - 它们被简单地禁用了。真的?

我发现很难相信交易不能在这种环境下工作,但找不到合适的例子。

Mono 2.6.7,MySQL Connection / NET 6.3.4,Subsonic 3,Ubuntu 10.10

2 个答案:

答案 0 :(得分:0)

想出来。它的TransactionScope似乎不起作用。恢复到DbConnection.BeginTransaction工作正常。我已经在Subsonic下面写了如何做到这一点:http://www.toptensoftware.com/blog/posts/18/using-transactions-with-mono-mysql-and-subsonic

答案 1 :(得分:0)

我也遇到了单声道v.2.10.9和mysqlconnector v.6.6.5和6.7.2-Beta的这个问题,我无法找到解决这个问题的方法,但现在我明白了。

首先,我获取了mysqlconnector的来源,并将它们添加到我的项目文件夹中。如果我直接用单声道编译连接器但它没有。 然后我走过代码,发现在MySql.Data项目的文件Connection.cs的第530行有以下代码行:

#if !MONO && !CF && !RT
  Console.WriteLine("### Should not be here... ###");
  if (Transaction.Current != null && Settings.AutoEnlist)
    EnlistTransaction(Transaction.Current);
#endif

我添加了Console.WriteLine,如果我用单声道运行我的应用程序并且它出现,它也会出现。所以我评论了这一行,之后一切都在这一刻起作用。

然而,真正的解决方案不应该是注释掉一些代码行。 要解决此问题,您必须定义“MONO”符号。 如果您正在使用MonoDevelop,只需右键单击项目MySql.Data并选择编译器部分。在那里你会找到一个带有'define symbols'标签的文本框或类似的东西。只需将新符号“MONO”添加到此文本框中即可。