Есть ли способ явно зафиксировать и откатить транзакцию после того, как несколько клиентов и серверов отправят
Среда: приложение использует Spring Framework 2.5.6.SEC01 и iBatis 2.3.4.726. Это дизайн MVC.
Вот сценарий:
- Ввод / обновление данных с клиента
- Нажмите кнопку Обновить, чтобы отправить
- Обработка данных и выполнение DML (вставка, обновление, удаление)
- Верните результат клиенту и отобразите данные
- Однако после загрузки страницы мне нужно вызвать API через Javascript (у меня нет контроля над API, мне просто нужно передать обязательный параметр и проверить результат, если SUCCESS или ERROR)
Если API возвращает SUCCESS, ничего не поделаешь. Но он возвращает ОШИБКУ, я выдаю предупреждение, чтобы проинформировать пользователя.
У меня есть View(клиент), Service и Data Access Layers. Когда клиент выполняет отправку (сценарий № 2), он входит в Службу для обработки данных и автоматически запускает транзакцию (сценарий № 3). Автоматически выполнять фиксацию при выходе в Service и обратно к клиенту для отображения данных (сценарий № 4).
Проблема: Как я могу приостановить транзакцию, чтобы не выполнять фиксацию, а затем вернуться к клиенту для вызова API через Javascript. Когда API возвращает SUCCESS, выполните commit через Ajax (или другим способом) или, с другой стороны, откатите его.
Любое руководство в правильном направлении приветствуется.
1 ответ
Если я правильно понимаю, вы хотите запустить транзакцию базы данных, вставить данные (без фиксации), оставить соединение и транзакцию открытой, вернуться к клиенту и, основываясь на некотором результате JavaScript, выполнить коммит.
Это похоже на странный дизайн, где клиент может фактически держать соединение открытым, что делает ваше приложение чрезвычайно уязвимым для (D)DOS-атак или проблем клиента в целом.
Я бы очень старался переделать его следующим образом:
- После отправки позвоните в javascript, который вам нужен, чтобы подтвердить действие подтверждения / сохранения.
- Когда javascript завершится успешно, отправьте запрос на свой собственный сервер.
- Выполните обычную обработку соединения / транзакции в DAO, не подвергая транзакции клиенту.
Это быстрее, надежнее и, вероятно, меньше кода.