Преимущество SQL_TXN_SERIALIZABLE перед SQL_TXN_REPEATABLE_READ в DB2 и C ++ - PullRequest
1 голос
/ 24 февраля 2010

Мы столкнулись с проблемой в нашем приложении. У нас есть два экземпляра нашего приложения для мониторинга. Поведение приложения выглядит следующим образом:

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 замедлит доступ к базе данных.

Если кто-нибудь сталкивался с этой проблемой в режиме реального времени, не могли бы вы поделиться решением.

Любые мысли / предложения приветствуются.

Спасибо, Мэтью Лию

1 Ответ

1 голос
/ 25 февраля 2010

Возможно, вы захотите использовать SQL_TXN_READ_COMMITTED, а не SQL_TXN_REPEATABLE_READ или SQL_TXN_SERIALIZABLE, поскольку он обеспечивает лучший параллелизм, чем два других метода.

См. Документацию DB2 по уровням изоляции , учитывая следующее отображение:

   CLI Name                    DB2 Isolation Level
   ------------------------    -------------------
   SQL_TXN_READ_UNCOMMITTED    Uncommitted Read
   SQL_TXN_READ_COMMITTED      Cursor Stability
   SQL_TXN_REPEATABLE_READ     Read Stability
   SQL_TXN_SERIALIZABLE        Repeatable Read

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...