Мы столкнулись с проблемой в нашем приложении. У нас есть два экземпляра нашего приложения для мониторинга. Поведение приложения выглядит следующим образом:
Step 1. Monitor the ftp folder in a loop
Step 2. If files are present, insert the file details to DB for the all files
Step 3. Read the file details from the DB and process it
Step 4. Once the file is selected from DB change the status to start processing so that no other process should process it.
Здесь мы имеем два процесса монитора, два экземпляра одной и той же программы (монитор - экземпляр 1 && монитор - экземпляр 2)
Здесь в определенное время и монитор процесса1, и монитор2 считывают одни и те же данные из БД и процесса. Из-за этого один и тот же файл обрабатывается дважды.
Это связано с задержкой в шаге 3 и шаге 4. Monitor1 выполняет шаг 3, и перед шагом 4, monitor2 также выполняет шаг 3, так что он не знал, что уже monitor1 получил запись.
Наша база данных - db2, и мы используем уровень изоляции SQL_TXN_READ_UNCOMMITTED на шаге 3. На сайте IBM я обнаружил, что SQL_TXN_REPEATABLE_READ или SQL_TXN_SERIALIZABLE являются решениями для этого, поскольку это предотвратит грязное чтение.
Какой вариант лучше всего использовать в нашей ситуации. Я прочитал из сети, что SQL_TXN_SERIALIZABLE замедлит доступ к базе данных.
Если кто-нибудь сталкивался с этой проблемой в режиме реального времени, не могли бы вы поделиться решением.
Любые мысли / предложения приветствуются.
Спасибо,
Мэтью Лию