Есть ли способ явно зафиксировать и откатить транзакцию после того, как несколько клиентов и серверов отправят

Среда: приложение использует Spring Framework 2.5.6.SEC01 и iBatis 2.3.4.726. Это дизайн MVC.

Вот сценарий:

  1. Ввод / обновление данных с клиента
  2. Нажмите кнопку Обновить, чтобы отправить
  3. Обработка данных и выполнение DML (вставка, обновление, удаление)
  4. Верните результат клиенту и отобразите данные
  5. Однако после загрузки страницы мне нужно вызвать API через Javascript (у меня нет контроля над API, мне просто нужно передать обязательный параметр и проверить результат, если SUCCESS или ERROR)
  6. Если API возвращает SUCCESS, ничего не поделаешь. Но он возвращает ОШИБКУ, я выдаю предупреждение, чтобы проинформировать пользователя.

    У меня есть View(клиент), Service и Data Access Layers. Когда клиент выполняет отправку (сценарий № 2), он входит в Службу для обработки данных и автоматически запускает транзакцию (сценарий № 3). Автоматически выполнять фиксацию при выходе в Service и обратно к клиенту для отображения данных (сценарий № 4).

Проблема: Как я могу приостановить транзакцию, чтобы не выполнять фиксацию, а затем вернуться к клиенту для вызова API через Javascript. Когда API возвращает SUCCESS, выполните commit через Ajax (или другим способом) или, с другой стороны, откатите его.

Любое руководство в правильном направлении приветствуется.

1 ответ

Решение

Если я правильно понимаю, вы хотите запустить транзакцию базы данных, вставить данные (без фиксации), оставить соединение и транзакцию открытой, вернуться к клиенту и, основываясь на некотором результате JavaScript, выполнить коммит.

Это похоже на странный дизайн, где клиент может фактически держать соединение открытым, что делает ваше приложение чрезвычайно уязвимым для (D)DOS-атак или проблем клиента в целом.

Я бы очень старался переделать его следующим образом:

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

Это быстрее, надежнее и, вероятно, меньше кода.

Другие вопросы по тегам