Обработка транзакций с использованием PHP и MySQL - PullRequest
2 голосов
/ 12 октября 2009

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 22 апреля 2012

Посмотрите на LIXA Transaction Manager (http://lixa.sourceforge.net/), он интегрирует PHP и MySQL, начиная с версии 0.9.0

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

Привет

Ch. F.

2 голосов
/ 12 октября 2009

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

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

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

НТН

0 голосов
/ 13 октября 2009

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

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

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

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

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

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

...