Избегайте блокировок в команде Oracle UPDATE - PullRequest
1 голос
/ 11 октября 2011

Если я пытаюсь получить блокировку в Oracle 10g (например, с помощью SELECT...FOR UPDATE), есть опция NOWAIT, чтобы получить сообщение об ошибке, когда строка заблокирована, а не просто запрос зависает.Есть ли способ добиться этого для простого UPDATE заявления?В Oracle 11g есть опция DDL_LOCK_TIMEOUT , мне нужно что-то подобное для операций DML (и в 10g).

(Справочная информация: у меня есть несколько модульных тестов, которые запрашивают базу данных (которая являетсяк сожалению, это не изолированная тестовая база данных, а база данных разработки, используемая для различных целей), и я хочу, чтобы они немедленно выдавали ошибку, а не зависали, когда что-то идет не так.)

1 Ответ

4 голосов
/ 11 октября 2011

Нет.Невозможно получить простой оператор UPDATE в тайм-ауте Oracle, если какой-то другой сеанс заблокировал строку, которую он пытается обновить.Конечно, вы могли бы написать код своих модульных тестов для выполнения SELECT ... FOR UPDATE WAIT <<n>> перед выполнением ОБНОВЛЕНИЯ.Это гарантировало бы, что к тому времени, когда вы дойдете до ОБНОВЛЕНИЯ, вы гарантированно уже получите блокировку.

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

...