ВЫБЕРИТЕ НЕ БЛОКИРОВАННЫЕ СТРОКИ с ORACLE «ДЛЯ ПЕРЕХОДА ОБНОВЛЕНИЯ БЛОКИРОВАН» в Oracle 11g - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно выбрать одну запись, которая не заблокирована с помощью FOR UPDATE SKIP LOCKED.

Когда я искал это, я обнаружил, что в 12C есть решение под названием FETCH.Но я использую Oracle 11g, и мне просто нужно получить одну запись из незаблокированных записей для обновления.

select * from t1 
where record_status = 'ACTIVE' 
FOR UPDATE SKIP LOCKED;

Выше запроса заблокированы все другие записи, которые не заблокированы.Пожалуйста, предложите решение, которое можно использовать для блокировки только одной записи и извлечения ее для обновления в oracle 11g.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

FOR cur IN (выберите rowid из mwt_user_wallet, где wallet_type = 'MCA') LOOP BEGIN выберите rowid в id из MWT_USER_WALLET, где rowid = cur.rowid для обновления nowait;ИСКЛЮЧЕНИЕ, КОГДА v_resourcr_busy THEN DBMS_OUTPUT.PUT_LINE («запись заблокирована»);КОНЕЦ;END LOOP;

Можем ли мы использовать это для идентификации неблокированных строк?

0 голосов
/ 04 июня 2019

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

Давайте рассмотрим следующий пример:

-- session1

SQL> create table t1(id number);

Table created.

SQL> insert into t1 values(1);

1 row created.

SQL> insert into t1 values(2);

1 row created.

SQL> insert into t1 values(3);

1 row created.

SQL> insert into t1 values(4);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from t1 where id = 2 for update skip locked;

        ID
----------
         2



-- Session 2

SQL> select * from t1 where rownum <= 1 for update skip locked;

        ID
----------
         1



-- Session 3

SQL> select * from t1 for update skip locked;

        ID
----------
         3
         4

Надеюсь, это все прояснит.

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

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