2010-10-03 49 views
0

有谁知道如何让MySQL事务在Mono下工作?我使用MySQL连接器/ NET(通过Subsonic 3),它在Microsoft .NET下完美工作。然而,最近我尝试在Ubuntu的Mono下运行同一个站点,它几乎可以工作 - 除了我似乎无法使事务工作。MySQL连接器/ NET - 支持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网站,这似乎指向单声道不支持所需的基础设施,以使交易工作的这几个提及。还有一个评论说,使用CommittableTransaction而不是TransactionScope时事务工作正常。所以我试了一下,但得到了同样的例外。

对MySQL网站的另一个评论建议使用MONO构建选项重建MySQL数据提供程序。我尝试过的网站现在可以工作,但是交易没有被使用 - 他们已经被禁用了。真?

我发现很难相信事务不能在这个环境中工作,但找不到工作的例子。

单声道2.6.7,MySQL连接/ NET 6.3.4,亚音速3的,Ubuntu 10.10

回答

0

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

首先我把mysqlconnector的来源加入到我的项目文件夹中。如果我直接使用单声道编译连接器,但认为它不工作,它会工作。 然后我走进低谷的代码,我发现有代码的行530以下行MySql.Data项目的文件Connection.cs在:

#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并选择编译器部分。在那里你会找到一个带有“定义符号”或类似标签的文本框。只需在该文本框中添加新符号“MONO”。