nord_ua
@nord_ua

Не работает распределенная транзакция на PHP + MySQL?

Добрый день.

Случилось мне использовать распределенные транзакции в 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)



Т.е. от транзакции никакого проку нет. С чем это может быть связано? Можно конечно следить кодом за тем что бы не было ошибок в логе, но тогда вообще нет смысла в транзакциях.
  • Вопрос задан
  • 3676 просмотров
Пригласить эксперта
Ответы на вопрос 2
vajadhava
@vajadhava
фиг его знает…
попробуйте в таком порядке:

[localhost] XA END 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA END 'tx-4f633bd5cfd9c7.06037054'
[localhost] XA PREPARE 'tx-4f633bd5cfd9c7.06037054'
[192.168.56.10] XA PREPARE 'tx-4f633bd5cfd9c7.06037054'
Ответ написан
Комментировать
romik
@romik
Двухфазный коммит в основном защищает от того, что у какого-либо из участников нарушится констрейнт и он откажется коммитить. Некоторые другие сбои он тоже переживает, но не вмешательство человека, поставившего себе задачу его сломать.
Ну и похоже bugs.mysql.com/bug.php?id=12161 тоже имеет отношение к вашему вопросу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы