Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте. Помогите разобраться с ХА транзакциями. Почитал http://dev.mysql.com/doc/refman/5.0/en/xa-states.html , но приведенный пример с одним соединением.
Вот так я сделал, но это не работает, вернее не совсем так, как я бы хотел. Транзакции работают, но каждая отдельно :
cn2.Execute "XA START 'mytrans'
cn.Execute "XA START 'mytrans'"
cn2.Execute "INSERT ....."
cn.Execute "UPDATE ......."
cn.Execute "XA END 'mytrans'"
cn2.Execute "XA END 'mytrans'"
cn.Execute "XA PREPARE 'mytrans'"
cn2.Execute "XA PREPARE 'mytrans'"
cn2.Execute "XA COMMIT 'mytrans'"
cn.Execute "XA COMMIT 'mytrans'"
Как использовать два соединения, чтобы они работали в одной транзакции ?
Неактивен
XA используется не для того, чтобы два соединения работали в одной транзакции,
а для того, чтобы два сервера могли одновременно или применить, или откатить
какбы распределенную транзакцию.
В этом случае нужно делать нужно именно так, как у Вас написано.
Неактивен
Спасибо за ответ. Возможно неправильно сформулировал, но в данном случае у меня оба сервера не одновременно приняли транзакцию. Тестировал с точками останова. Так вот , остановил между двумя коммитами и на одном из серверов изменилась информация, на втором, естественно нет. В этом случае ни о какой распределенной транзакции не может быть и речи.
Еше, несколько вопросов, чтобы прояснить ситуацию. Повторюсь, что ХА транзакции для меня новинка. 1) должны ли быть одной версии сервера MySQL ? 2) Сам сервер MySQL является какбы диспечером транзакций или нужно еще чтото дополнительно ставить, типа плагина ?
Если я всетаки делал все как надо, почему у меня НЕ одновременно на двух серверах принимаются транзакции ?
Спасибо
Отредактированно SergeyCh (03.03.2010 20:56:25)
Неактивен
Как Вы отслеживаете одновременность?
Неактивен
Проимитировав ситуацию отключения одного из серверов между коммитами. Тоесть выполнил вышеприведенный пример без последней строчки. Ситуация вполне реальна-- отключение интернета, перезагрузка и т.д. В этом случае данные на cn2 приняты были, на первом нет.
Неактивен
К сожалению, в этом месте есть бага — корректно убитое соединение (пришедший
RST в пакете) полностью убивает все ассоциированные с соединением транзакции
(в том числе и XA). Если соединение убилось не целиком (например, моргнула сеть,
наиболее частое действие), то Вы можете восстановить транзакцию из другого со-
единения.
В ближайшее время, видимо, не починят. http://bugs.mysql.com/bug.php?id=12161
Неактивен
Спасибо за разъяснение. Почитал по Вашей ссылке, перспектива не радужная. На мой взгляд подход не совсем верный . В логах можно поковырятся, если оба соединения к разным базам на одном сервере, но если сервера разные, то .... Было бы надежнее , имхо, делать менеджер транзакций, чтото вроде MS DTC. Кстати, есть ли для MySQL подобный менеджер ?
Спасибо.
Неактивен
Подход нормальный, просто в документе Open group есть xa_forget, которого нет
в MySQL, и который надо бы доделать.
Менеджера транзакций готового нету. Если напишете — дайте знать, мы его будем
рекламировать
Неактивен