Кто-нибудь знает, как заставить транзакции MySQL работать под Mono?
Я использую MySQL Connector/NET (через Subsonic 3), и он отлично работает в Microsoft.NET. Недавно, однако, я попытался запустить тот же сайт под Mono на Ubuntu, и он почти работает - за исключением того, что я не могу заставить транзакции работать.
Чтение на сайтах 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 предложил перестроить поставщик данных MySQL с помощью опции MONO
build. Который я попробовал, и сайт теперь работает, но транзакции не используются - они просто отключены. Действительно?
Мне трудно поверить, что транзакции не могут работать в этой среде, но не могут найти рабочий пример.
Mono 2.6.7, MySQL Connection/NET 6.3.4, Subsonic 3, Ubuntu 10.10
Выяснил это. Это TransactionScope, который, похоже, не работает. Возврат к DbConnection.BeginTransaction работает отлично. Я написал, как это сделать в Subsonic здесь: http://www.toptensoftware.com/blog/posts/18/using-transactions-with-mono-mysql-and-subsonic
У меня также была эта проблема с mono v.2.10.9 и mysqlconnector
v. 6.6.5 и 6.7.2-Beta, и мне не удалось найти решение этой проблемы, но теперь я понял это.
Сначала я взял источники mysqlconnector
и добавил их в папку проекта. Думал, что это сработает, если я скомпилирую коннектор напрямую с моно, но это не так.
Затем я прошел через код, и я обнаружил, что в строке 530 в файле Connection.cs
проекта MySql.Data есть строки кода в строке 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" в это текстовое поле.