У меня есть веб-сервис и пара асинхронных служб, работающих на фоновом режиме (для длительных процессов сбора данных), которые используют ту же библиотеку DAO и общий источник данных. Библиотека DAO реализована с использованием шаблона Spring JDBC. RDBMS - PostgreSQL.
Это редко случается, когда веб-служба и асинхронные службы одновременно изменяют одни и те же строки в одной таблице через DAO, и в результате я получаю несогласованные данные.
Например, у меня есть поле «state» в сущности, которая может принимать значение: 1 - платный, 2 - неоплаченный.
Иногда у меня такие ситуации:Как справиться с одновременной модификацией изменений данных и слиянием в веб-службе (оптимистичный/пессимистический блокировка)?
- сделка # 1: Веб-служба изменяют "состояние" значение от 1 до 2 к строке с ID = 1.
- транзакции # 2: В то же время асинхронная служба захватывает некоторые данные с некоторых конечных точек и модифицирует другие поля строки с идентификатором = 1. Но удержание поля «состояние» 1. Оно не знает, что значение «состояние» было изменено с 1 до 2 в транзакции № 1.
В результате у меня «состояние» равно 1, хотя оно должно быть 2. Оно также работает противоречиво. Несколько раз асинхронная служба меняет поле «состояние», и веб-служба не знает об этом изменении и снова создает беспорядок в данных. Это происходит не только с полем государства, конечно.
У меня есть два варианта:
- Используйте пессимистический SELECT ... FOR UPDATE.
Но он не подходит для меня , потому что веб-сервис очень часто получает части строк из таблицы. Он не может ждать длительного периода времени, пока асинхронный сервис удерживает блокировки, потому что производительность здесь критическая. - Используйте оптимистичную блокировку. Поле «Версия» и т. Д.
Но я не могу просто откат изменений в случае оптимистической блокировки, потому что это изменение необходимо объединить. Несколько раз я не могу просто повторить операцию из-за атомных операций в других системах, которые не являются частью весенней транзакции jdbc.
Может быть, существуют некоторые шаблоны для обработки таких случаев, чтобы объединить данные?
Спасибо,
Ивана
Это не совсем дубликат, потому что этот вопрос касается проблемы длительной работы и нескольких более коротких в той же базе данных. Этот вопрос ** не затрагивается другим вопросом или любым его ответом. –