2011-01-12 4 views
3

В настоящее время мы пытаемся реализовать SELECT FOR UPDATE для блокировки строк. Если я запускаю:ORACLE PL/SQL: тестирование SELECT FOR UPDATE в Oracle SQL Developer

SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE; 
SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE NOWAIT; 

Я ничего не получил в ORACLE SQL Developer. Разве это не должно меня заблуждаться? Связано ли это с использованием одного и того же идентификатора пользователя?

ответ

5

Что вы имеете в виду «я ничего не получаю обратно»? Вы имеете в виду, что ни один запрос не возвращает строки? Если это так, это означает, что в таблице нет строк, имеющих этот ROWID. Вы имеете в виду, что первый (или второй) оператор никогда не возвращается? Если это так, сеанс блокируется в ожидании блокировки.

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

+0

Моя первоначальная мысль заключалась в том, что, поскольку я работал над тем же соединением, это просто переписывалось. Вы это подтвердили. Благодарю. – jlrolin

1

Вы запрашиваете блокировку на столе, который вы уже заблокировали в , что сделка.

Вам необходимо запустить второй ВЫБРАТЬ из другого соединения (то есть другой транзакции)

+0

Вот что я думал ... спасибо. – jlrolin

Смежные вопросы