Вопрос

Я пытаюсь внедрить двухфазный коммит с использованием PHP и MySQL и не хватает.

Основной блок, который я обнаружил, заключается в том, что я не могу хранить ресурс соединения MySQL в месте, где я могу найти его снова для второго этапа. Можно ли сериализовать рукоятку базы данных?

Вот случай, когда я пытаюсь кодировать:

  1. Пользователь отправляет данные
  2. Сервер запускает транзакцию MySQL и выполняет некоторые запросы на основе полученных данных.
  3. Сервер отправляет файл обратно пользователю
  4. Когда пользователь успешно получил файл, сервер совершает свою транзакцию. В противном случае он откатывает его обратно.

Похоже, что это требует двух HTTP-запросов/ответных циклов, поэтому мне нужно иметь возможность повторно подключаться к одной и той же рукояте базы данных во втором запросе, чтобы совершить транзакцию. Я терпел неудачу в этой части.

Любой совет приветствуется, даже если это «это невозможно в PHP»

Это было полезно?

Решение

Взгляните на Lixa Transaction Manager (http://lixa.sourceforge.net/). Он интегрирует PHP и MySQL, начиная с выпуска 0.9.0

Он также обеспечивает обработку распределенных транзакций, а также двухфазную функцию коммита.

С Уважением

Гнездо Фон

Другие советы

Поскольку PHP основан на запросе / ответе, реализация постоянного соединения БД не является возможностью, AFAIK.

Вы можете попытаться обойти это ограничение, используя своего рода механизм продажи билетов. Ваши шаги будут:

  1. Пользователь отправляет данные
  2. Сервер запускает транзакцию MySQL и выполняет некоторые запросы на основе полученных данных, назначая «уникальный» билет на эту транзакцию.
  3. Сервер отправляет файл и билет обратно в пользователь
  4. Когда пользователь успешно получил файл и отправил еще один запрос, содержащий этот билет, сервер совершает транзакцию. В противном случае он откатывает его обратно.
  5. Ссылаясь на комментарий Кэсси: через определенный период времени все не запланировано TAS, чтобы не допустить, чтобы ваш БД был «затоплен» со старыми транзакциями

Hth

Чтобы ответить на KB22 и Rojoca, причина, по которой мне нужно сделать это таким образом, заключается в том, что «файл», на который я имею в виду, на самом деле является базой данных SQLite, которая заканчивается как хранилище данных на мобильном устройстве.

Первый запрос публикует обновленную базу данных SQLite на сервер, которая пытается объединиться в данных из таблиц SQLite; Проблемы возникают, когда мобильное устройство не успешно получает новую базу данных SQLite (одна, которая отражает изменения мобильного устройства и любые другие новые вещи из веб -приложения), потому что он затем попытается отправить ту же (старую) базу данных SQLITE в Интернет во второй раз, в результате чего дублируются записи в веб -таблицах для всего, что было создано на мобильном устройстве.

Таким образом, Интернет должен быть уверен, что устройство имеет новую базу данных, прежде чем совершать изменения слияния. Учитывая капризы сетей, это кажется возможным, только если устройство может отправить явный ACK после получения новой базы данных SQLite. И это возможно только в том случае, если мы сделаем два запроса (1. База данных SQLite для слияния; 2. ACK получения новой базы данных SQLite на устройстве).

Действительно, колючая проблема, и это полезная информация, чтобы выяснить, что PHP не может манипулировать базой данных до необходимого уровня.

Я также не думаю, что смогу использовать таблицу транзакций, потому что мне нужно вернуть данные на устройство на основе «реальных» таблиц веб -базы данных. Я думаю, что я столкнулся с проблемами с полей Auto_Increment, если бы я не использовал настоящие таблицы

Спасибо за все ваши комментарии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top