Постоянная транзакция в подходе клиент-сервер

#php #client-server #database-connection #connection-pooling #transactional

#php #клиент-сервер #подключение к базе данных #объединение в пул соединений #транзакционный

Вопрос:

В моем приложении (клиент-сервер) мне нужно отредактировать некоторые строки (из базы данных), и пока они редактируются, никто не должен иметь возможности редактировать также. Это, конечно, делается транзакциями. Проблема в том, что в клиентской среде транзакции управляются на стороне сервера, поэтому клиент, который редактирует строки, не может получить доступ к транзакции напрямую. (Я работаю с PHP в этой ситуации, но думаю, что тот же подход принят и в других технологиях). Итак, мне нужно сохранить транзакцию открытой (для сохранения строк заблокированными для редактирования), пока клиент не завершит редактирование. В PHP постоянное соединение не поможет, потому что они могут быть разорваны с другими клиентами, расположенными на одном хосте с вышеупомянутым клиентом. У вас есть какие-либо идеи для моего сценария?

Спасибо.

Ответ №1:

Обычно такие случаи обрабатываются с помощью бизнес-блокировок, которые вы устанавливаете непосредственно на объекты или на родительский элемент объектов.

Добавьте столбец типа «inedition», которому вы присваиваете значение true, когда пользователь запрашивает редактирование, и значение false, когда пользователь подтверждает / отменяет свое редактирование.

Имейте в виду, что транзакции некоторых пользователей, вероятно, будут потеряны до того, как вы разблокируете строку, поэтому вам, вероятно, потребуется:

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

Редактировать: Такого рода решение используется всякий раз, когда вы не хотите полагаться на специфичную функцию базы данных, такую как Oracle «Выбрать для обновления». В Java компонент EJB с полным состоянием может сохранять ссылку на транзакцию из пользовательского интерфейса в базу данных. Могут быть решения, использующие PHP для Oracle или другую специфичную для базы данных функцию, касающуюся транзакций, в зависимости от баз данных.