Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Проблема с XA aka Distributed transaction в php


Автор: 02077461 16.3.2012, 16:29
Добрый день.
Случилось мне использовать http://dev.mysql.com/doc/refman/5.0/en/xa.html в php скрипте. Насколько я понял из доки имея несколько коннектов к бд в каждом мы должны открыть XA транзакцию с уникальным идентификатором, затем завершить ее, подготовить и закоммитить.
т.е. выглядит так:
Код

[localhost] XA START 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA START 'tx-4f633bd5cfd9c7.06037054'
[localhost] INSERT INTO `some_table` (field, value) VALUES ('field 191', '845')
[192.168.56.10] INSERT INTO `some_table` (field, value) VALUES ('field 191', '558')
[localhost] XA END 'tx-4f633bd5cfd9c7.06037054'
[localhost] XA PREPARE 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA END 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA PREPARE 'tx-4f633bd5cfd9c7.06037054'
[localhost] XA COMMIT 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA COMMIT 'tx-4f633bd5cfd9c7.06037054'

Код который так делает можете найти в аттаче. 
Все работает как надо когда все работает как надо. Но когда я опускаю один сервер после того как сделал END и PREPARE  и непосредственно перед тем как делать COMMIT я получаю следующее сообщение:

Код

LAST INT: 325
[localhost] XA START 'tx-4f633eb70ca183.03963688'
[192.168.56.10] XA START 'tx-4f633eb70ca183.03963688'
[localhost] INSERT INTO `some_table` (field, value) VALUES ('field 325', '818')
[192.168.56.10] INSERT INTO `some_table` (field, value) VALUES ('field 325', '677')
[localhost] XA END 'tx-4f633eb70ca183.03963688'
[localhost] XA PREPARE 'tx-4f633eb70ca183.03963688'
[192.168.56.10] XA END 'tx-4f633eb70ca183.03963688'
[192.168.56.10] XA PREPARE 'tx-4f633eb70ca183.03963688'
Sleep. Press enter...

Done. Commiting.
[localhost] XA COMMIT 'tx-4f633eb70ca183.03963688'
[192.168.56.10] XA COMMIT 'tx-4f633eb70ca183.03963688'
[192.168.56.10] ERROR: MySQL server has gone away


По логам все правильно, вот только на первом сервере в базу строка вставилась, а на втором сервере -- нет. Кроме того нет транзации в RECOVERY.

Код

LOCALHOST:

mysql> select * from some_table;
+----+-----------+-------+
| id | field     | value |
+----+-----------+-------+
|  1 | field 325 | 818   |
+----+-----------+-------+
1 row in set (0.00 sec)

mysql> XA RECOVER;
Empty set (0.00 sec)


Код

192.168.56.10

mysql> select * from some_table;
Empty set (0.00 sec)

mysql> xa recover;
Empty set (0.00 sec)



Т.е. от транзакции никакого проку нет. С чем это может быть связано? Можно конечно следить кодом за тем что бы не было ошибок в логе, но тогда вообще нет смысла в транзакциях. 

Автор: aborod 7.12.2012, 16:21
Здравствуйте!

Тоже интересует реализация XA в MySQL. Подскажите, какой версии у вас MySQL? На забугорных форумах пишут, что они вроде сначала добавили интерфейс, и лишь несколько выпусков спустя сделали полноценную поддержку. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)