MySQL Connector / NET - поддержка транзакций под Mono

0

Кто-нибудь знает, как заставить транзакции 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

Теги:
mono
transactionscope

2 ответа

0
Лучший ответ

Выяснил это. Это TransactionScope, который, похоже, не работает. Возврат к DbConnection.BeginTransaction работает отлично. Я написал, как это сделать в Subsonic здесь: http://www.toptensoftware.com/blog/posts/18/using-transactions-with-mono-mysql-and-subsonic

0

У меня также была эта проблема с 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" в это текстовое поле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню