2010-10-03 30 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」。