Очередь транзакций Oracle с использованием функции PHP oci pconnect в веб-сервисе
Я написал веб-сервис, используя классы PHP SOAP. Он имеет функции для возврата XML-данных из базы данных Oracle или для выполнения вставки/обновления/удаления в базе данных.
Однако в данный момент он использует автоматическую фиксацию, поэтому любая операция выполняется мгновенно.
Я смотрю, как поставить транзакции в очередь, а затем зафиксировать всю партию только тогда, когда пользователь нажимает кнопку "сохранить". Мне трудно выяснить, возможно ли это. Я не могу поддерживать последовательное соединение легко, так как, конечно, веб-сервис вызывается для отдельных операций.
Я пробовал использовать функцию PHP oci_pconnect
, но даже когда я каждый раз подключаюсь с одними и теми же параметрами, сеанс, похоже, закончился, и мои изменения не были внесены, когда я наконец позвонил oci_commit
.
Есть идеи?
2 answers
Повторное использование одного и того же незафиксированного сеанса базы данных между запросами PHP невозможно. У вас нет возможности заблокировать пользователя в PHP-процессах или подключении к БД, так как веб-сервер отправит запрос любому из многих из них случайным образом. Поэтому вы не можете хранить незафиксированные данные в сеансе Oracle между запросами.
Лучший способ сделать это действительно зависит от ваших требований. У меня такое чувство, что вам нужно какое-то хранилище сеансов (возможно, таблица базы данных с ключом на user_id) это может содержать все незавершенные транзакции между запросами. Когда пользователь нажмет сохранить, извлеките все ожидающие запросы и вставьте их в таблицу конечного назначения, а затем зафиксируйте.
Альтернативой было бы вставить все транзакции с флагом, который говорит, что они еще не завершены. После нажатия кнопки Сохранить обновите флаг, чтобы сообщить, что они завершены.
В любом случае, вам нужно где-то разместить ваши ожидающие запросы, пока не будет нажата эта кнопка сохранения.
DBMS_XA позволяет обмениваться транзакциями между сеансами.