2015-04-14 5 views
0

У меня есть таблица DB2, содержащая большое количество записей для отправки внешней системе через MQ. В таблице есть столбец, содержащий статус записи (отправленный или ожидающий отправки).z/os cics db2 cobol программа для обработки записей базы данных одновременно

Я пишу программу планировщика, чтобы постоянно проверять, есть ли записи в таблице, которые «отправляются на отправку». Если да, программа отправит ожидающие записи и обновит статус соответственно

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

Мои вопросы - как предотвратить одновременное получение и отправку одних и тех же записей несколькими планировщиками?

Мне сказали использовать курсор с замками на уровне строк? но я не уверен, как это работает

замечания: Я работаю над CICS COBOL в г/зева среде

+0

Вместо того, чтобы тратить ресурсы на то, что нужно постоянно смотреть на БД, почему бы вам просто не сделать MQ, когда вы делаете «ожидающий»? Как вы думаете о выполнении программы «планировщик»? –

+0

Существует длинная история за @BillWoodger. Отправляемые сообщения будут подтверждаться из систем счетчиков.Существует порог отправки сообщений. Скажем, если отправлено 500 сообщений, но нет подтверждения, нам нужно будет прекратить отправлять дальнейшие сообщения. Таким образом, существует определенная логика для определения и отправки сообщений. Но несколько экземпляров осложняют ситуацию – william

+0

Вам необходимо обновить свой вопрос со всей необходимой информацией (используйте ссылку редактирования под вопрос). Мы не можем делать весь дизайн, потому что мы не все знаем. Написание собственного «планировщика» очень сложно и сложно обойтись без влияния на другую обработку. Неизменная многократная задача автоматически запускается, это плохая идея. Checker и doer даже получают доступ к тем же данным. Если у вас есть записи в очереди, вы всегда можете проверить и переустановить их, если это необходимо. –

ответ

0

Один из способов сделать это следующим образом 1) Определить индекс кластеризации для таблицы больших DB2 2) Затем имеют разные экземпляры программы, которые просматривают только разные части этого индекса кластеризации. EG, если индекс кластеризации находился в поле числового идентификатора, которое является уникальным, например идентификатор учетной записи и размер идентификатора, является целым числом 9, чем один экземпляр, который показывает, что идентификаторы учетных записей варьируются от 0 до 099999999, а экземпляр 2 - с идентификаторами ID от 100000000 до 1999999999 и .....

Таким образом вы можете написать свой cusror с удержанием, выполнить обновления и совершить по необходимости.

1

У меня возникли проблемы с дизайном. Мы выполняем нечто подобное, что вы пытаетесь сделать, имея триггер в таблице DB2, который отправляет сообщение MQ в очередь, которая определена для запуска транзакции CICS.

В вашем случае вы можете вообще отказаться от CICS и просто делать то, что предлагает @BillWoodger и отправлять сообщение, когда вы устанавливаете флаг ожидания.

0

CICS будет координировать транзакции SQL с DB2 для вас. Каждая из выполненных вами транзакций CICS будет иметь возможность выбирать и блокировать строки обновлений, и DB2 может координировать их между всеми и предотвращать выбор нескольких записей, если вы делаете две вещи.

Когда вы читаете строки, которые соответствуют критериям, используйте операцию типа SELECT FOR UPDATE, это блокирует каждую полученную строку и предотвращает доступ других параллельных транзакций к одному и тому же (также для вас требуется BIND с блокировками уровня строки, если вы не хотите, чтобы полные страницы заблокированы, обратитесь к администратору базы данных об опциях на основе размера строки).

Прежде чем вы отпустите записи или завершите транзакцию CICS, вы должны сделать что-то, чтобы пометить указанные записи как «отправленные», чтобы другие, ожидающие, параллельные транзакции не захватывали их и не отправляли их снова. Это может быть так же просто, как добавление отправленного столбца Y/N в таблицу и добавление «И отправлено <>« Y »в ваше предложение where where. После того, как вы отправили записи, сделайте ОБНОВЛЕНИЕ на этих записях и установите send = 'Y'. В зависимости от ваших данных строки вы могли бы использовать что-то еще, например, время отправлено или что-то еще, это просто должно быть чем-то, что исключало бы эту строку из повторного выбора.