Я пытаюсь реализовать двухэтапную фиксацию с использованием PHP и MySQL, и у меня не получается.
Главный блок, который я обнаружил, заключается в том, что я не могу сохранить ресурс подключения MySQL в том месте, где я могу снова найти его для второй фазы. Можно ли сериализовать дескриптор базы данных?
Вот случай, для которого я пытаюсь написать код:
- Пользователь отправляет данные
- Сервер запускает транзакцию MySQL и выполняет некоторые запросы на основе полученных данных.
- Сервер отправляет файл обратно пользователю
- Когда пользователь успешно получил файл, сервер совершает транзакцию. Иначе откатывает обратно.
Похоже, для этого требуется два цикла HTTP-запроса / ответа, поэтому мне нужно иметь возможность повторно подключиться к тому же дескриптору базы данных во втором запросе, чтобы зафиксировать транзакцию. Я терпел неудачу в этой части.
Приветствуются любые советы, даже если «это невозможно в PHP».
3 ответа
Взгляните на LIXA Transaction Manager (http://lixa.sourceforge.net/), он интегрирует PHP и MySQL, начиная с версии 0.9.0.
Он также обеспечивает распределенную обработку транзакций и двухфазную фиксацию.
Отношении
Гл. Ф.
Поскольку php основан на запросах / ответах, реализация постоянного соединения с БД невозможна, AFAIK.
Вы можете попытаться обойти это ограничение, используя своего рода механизм продажи билетов. Ваши шаги будут:
- Пользователь отправляет данные
- Сервер запускает транзакцию MySQL и выполняет некоторые запросы на основе полученных данных, присваивая этой транзакции «уникальный» билет.
- Сервер отправляет файл и билет обратно пользователю
- Когда пользователь успешно получил файл и отправил другой запрос, содержащий этот билет, сервер фиксирует свою транзакцию. Иначе откатывает обратно.
- ссылаясь на комментарий Касси: по прошествии определенного периода времени все невыполненные TA должны быть откатаны, чтобы предотвратить `` затопление '' вашей базы данных старыми транзакциями
HTH
Чтобы ответить на вопросы KB22 и rojoca, причина, по которой мне нужно сделать это таким образом, заключается в том, что «файл», о котором я говорю, на самом деле является базой данных sqlite, которая в конечном итоге становится хранилищем данных на мобильном устройстве.
Первый запрос отправляет обновленную базу данных sqlite на сервер, который пытается объединить данные из таблиц sqlite; Проблемы возникают, когда мобильное устройство не получает новую базу данных sqlite (ту, которая отражает изменения мобильного устройства и любые другие новые данные из веб-приложения), потому что затем оно пытается отправить ту же (старую) базу данных sqlite в web во второй раз, что приводит к дублированию записей в веб-таблицах для всего, что было создано на мобильном устройстве.
Таким образом, Интернет должен быть уверен, что на устройстве есть новая база данных, прежде чем фиксировать изменения слияния. Учитывая капризы сетей, это кажется возможным только в том случае, если устройство может отправлять явный ACK после получения новой базы данных sqlite. И это возможно только в том случае, если мы сделаем два запроса (1. База данных sqlite для слияния; 2. ACK получения новой базы данных sqlite на устройстве).
Действительно сложная проблема, и это полезная информация, чтобы узнать, что PHP не может управлять дескрипторами базы данных до необходимого уровня.
[Я также не думаю, что могу использовать таблицу транзакций, потому что мне нужно возвращать данные на устройство на основе «реальных» таблиц веб-базы данных. Я думаю, что столкнулся бы с проблемами с полями auto_increment, если бы не использовал настоящие таблицы]
Спасибо за все ваши комментарии.
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.