ORACLE PL / SQL: тестирование SELECT FOR UPDATE в Oracle SQL Developer - PullRequest
3 голосов
/ 12 января 2011

В настоящее время мы пытаемся реализовать SELECT FOR UPDATE для блокировки строк. Если я бегу:

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

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

Ответы [ 2 ]

5 голосов
/ 12 января 2011

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

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

1 голос
/ 12 января 2011

Вы запрашиваете блокировку таблицы, которую вы уже заблокировали в этой транзакции .

Вам необходимо запустить второй SELECT из другого соединения (т.е. из другой транзакции)

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