Как управлять одновременным доступом в процедуре SQL - PullRequest
1 голос
/ 17 апреля 2019

Я создал процедуру sql в моей базе данных oracle, которую позже буду вызывать в моем коде c #,

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

Тело процедуры выглядит следующим образом.

FOR item IN
       ( SELECT * FROM
             (SELECT tab1.item1,tab1.item2,tab1.item3... 
               FROM tab1
               INNER JOIN tab2 ON ...condition...
               INNER JOIN TAB3 ON ...condition...

               WHERE ....main_condition=true;

               ORDER BY  tab1.item1
              )
          WHERE ROWNUM < in_param
        )
    LOOP

        .
        .
        .
        dbms_lock.sleep(4);
        .
        .
        .
        "set main_condition=false;" 
        commit;

    END LOOP;

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

спасибо.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

«условие, что каждая запись должна обрабатываться только один раз».

Звучит как очередь.Обычный способ управления этим состоял бы в реализации очереди с помощью курсора SELECT… FOR UPDATE SKIP LOCKED.Здесь есть очень важное предостережение: что обработка , на которую вы ссылаетесь в своем вопросе, включает в себя что-то, что влияет на первоначальные критерии, скажем, путем обновления значения статуса или удаления идентифицирующей записи (или любых других, к сожалению, вопросов, которыенеясны в отношении их специфики, могут привлекать только одинаково расплывчатые ответы)строка.Обновление столбцов, которые содержат предложение WHERE, предотвратит обработку одной и той же записи более одного раза.

1 голос
/ 17 апреля 2019

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

Вы можете изменить свой запрос и использовать ORDER BY DBMS_RANDOM.VALUE для получения случайных строк. Следовательно, вы можете изменить свой запрос как

SELECT * FROM
             (SELECT tab1.item1,tab1.item2,tab1.item3... 
               FROM tab1
               INNER JOIN tab2 ON ...condition...
               INNER JOIN TAB3 ON ...condition...

               WHERE ....main_condition=true;

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