Добрый день.
Случилось мне использовать распределенные транзакции в 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)
Т.е. от транзакции никакого проку нет. С чем это может быть связано? Можно конечно следить кодом за тем что бы не было ошибок в логе, но тогда вообще нет смысла в транзакциях.