有没有人知道如何在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
答案 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”添加到此文本框中即可。