Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Нашёл на asktom улыбнуло

select 1/0 from table where id=1 for update nowait

ResuourceBysyException - строка залочена
DivByZeroException - строка незалочена и из за деления на 0 не будет залочена



Есть интересно более мудрые примеры решения задачи ?

COMMIT;
5 фев 09, 13:58    [6783193]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
test_2008,

Такой запрос теоретически может порвать ещё на этапе компиляции, если оракл решит вычислить константы.

Для такого рода операций есть DBMS_LOCK, но и в нём нет функции тестирования блокировки без её захвата.
5 фев 09, 14:13    [6783321]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
mcureenab

Такой запрос теоретически может порвать ещё на этапе компиляции, если оракл решит вычислить константы.


Ну это не проблема
select 1/(select count(*) from dual where 1=0) from table where 1=0 for update nowait
5 фев 09, 14:41    [6783529]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Ошибся

select 1/(select count(*) from dual where 1=0) from table where id=1 for update nowait

COMMIT;
5 фев 09, 14:42    [6783533]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Elic
Member

Откуда:
Сообщений: 29988
test_2008
Есть интересно более мудрые примеры решения задачи ?
В самой задаче не видно никакой мудрости :)
5 фев 09, 14:46    [6783569]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Elic
test_2008
Есть интересно более мудрые примеры решения задачи ?
В самой задаче не видно никакой мудрости :)


Интересно с чего бы она тогда на asktome обсуждалась ?
5 фев 09, 14:48    [6783598]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Elic
Member

Откуда:
Сообщений: 29988
test_2008
Интересно с чего бы она тогда на asktome обсуждалась ?
"Не сотвори себе кумира"
5 фев 09, 14:56    [6783649]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
test_2008
..
Ну это не проблема

да вариантов дурить железку - туча:
rownum/0 или 1/(rownum-1) и т.д.
5 фев 09, 15:31    [6783937]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
orawish
test_2008
..
Ну это не проблема

да вариантов дурить железку - туча:
rownum/0 или 1/(rownum-1) и т.д.


Да так покрасивше будет
5 фев 09, 15:42    [6784027]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Elic
test_2008
Есть интересно более мудрые примеры решения задачи ?
В самой задаче не видно никакой мудрости :)


Этой хрени есть применение. Типа процесс ждёт фиксации изменения данных в параллельных транзакциях. Если запись не заблокирована, то нужно проверить изменились ли данные (т.е. был это commit или rollback) и завершить работу. Если запись заблокирована нужно продолжать ожидание.

В случае ожидания одной транзакции можно просто выполнить select for update wait. Но в случае ожидания многих транзакций при таком подходе одна длинная транзакция блокирует процесс и не позволит ему получить изменения от коротких транзакций.

Конечно есть другие способы решить эту задачу.
5 фев 09, 15:53    [6784113]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
test_2008
orawish
test_2008
..
Ну это не проблема

да вариантов дурить железку - туча:
rownum/0 или 1/(rownum-1) и т.д.


Да так покрасивше будет


До дех пор, пока железка поддаётся обдуриванию.
5 фев 09, 15:55    [6784126]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
mcureenab
Этой хрени есть применение.


Применений воз и маленькая тележка.

Вообще странно что у Оракла так мало операций для работы с блокироваками строк.

Например, как быстро определить сколько строк залочено в таблице на данный момент, я так и не понял.
5 фев 09, 16:05    [6784206]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
test_2008
как быстро определить сколько строк залочено в таблице на данный момент, я так и не понял.


Быстро - никак. Нужно сканировать всю таблицу и смотреть на признак блокировки записи. Пока в синтаксисе SQL таких возможностей (типа псевдоколонки, такой как как ROWID) нет.
Может быть даже согласованный результат не удасться получить.
5 фев 09, 16:13    [6784262]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
test_2008
Например, как быстро определить сколько строк залочено в таблице на данный момент, я так и не понял.


Интересно, на "данный момент" - это на какой ? На момент, когда ты начал запрос,
или на момент, когда ты его закончил ?
5 фев 09, 16:15    [6784273]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Серафимный Шестикрыл
Интересно, на "данный момент" - это на какой ? На момент, когда ты начал запрос,
или на момент, когда ты его закончил ?


А на какой момент он проверяет FOR UPDATE-ом
на тот же
5 фев 09, 16:18    [6784303]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
mcureenab
Может быть даже согласованный результат не удасться получить.


Согласен
Но вот определить есть ли в принципе залоченные было бы не плохо.

Хотя обошёлся в задаче и без этого.
5 фев 09, 16:19    [6784308]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
test_2008

А на какой момент он проверяет FOR UPDATE-ом
на тот же


Лихо загнул.

(Подсказка - есть такая опция FOR UPDATE SKIP LOCKED, но тебе лучше сначала
тщательно изучить матчасть того, как работает обычный FOR UPDATE). Поищи по форуму,
тут это многократно обсуждалось.)
5 фев 09, 16:24    [6784354]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Серафимный Шестикрыл
UPDATE SKIP LOCKED


Обсуждалось
я же топик и создавал

Серафимный Шестикрыл
но тебе лучше сначала тщательно изучить матчасть того, как работает обычный FOR UPDATE). Поищи по форуму, тут это многократно обсуждалось.)


А тебе лучше вникнуть в смысл вопроса
FOR UPDATE будет лочить записи

И открою тебе тайну UPDATE SKIP LOCKED тоже будет лочить зафетченные записи ....

А хотелось бы просто получить количество залоченных ....

Но не суть без этого можно обойтись ...
5 фев 09, 16:28    [6784399]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
test_2008
А тебе лучше вникнуть в смысл вопроса


Вопросы надо задавать правильно. В правильно заданном вопросе - суть ответа.
Ты всерьез считаешь, что тебя просто так спросили, что ты подразумеваешь
под моментом срабатывания FOR UPDATE ?

test_2008

И открою тебе тайну


"А мужики-то не знают !"

test_2008

А хотелось бы просто получить количество залоченных ....


Еше раз подумай над своей фразой, с учетом твоих претензий к тому, что skip locked
блокирует записи. А потом уже будешь пытаться другим тайны открывать.
5 фев 09, 17:02    [6784703]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Серафимный Шестикрыл
Вопросы надо задавать правильно.


В данном случае это был не вопрос по количество и как сделать, а штрихи существующей проблемы.

Серафимный Шестикрыл

Ты всерьез считаешь, что тебя просто так спросили, что ты подразумеваешь
под моментом срабатывания FOR UPDATE ?


ну что ВЫ, куда же нам до ВАС
5 фев 09, 17:14    [6784794]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
test_2008
ну что ВЫ, куда же нам до ВАС


Ах, кисы обиделись... Я рыдалЪ (с)

1) "спросили" - Это обезличеная форма множественного числа. Означает всего лишь,
что некто сделал некое действие. С русским языком нелады ?

2) Думай. Если хочешь. Если не хочешь - не думай. Up to you.

Как уже сказали "в этой задаче немного мудрости" (c) Elic
5 фев 09, 17:19    [6784830]     Ответить | Цитировать Сообщить модератору
 Re: Проверка строки в таблице is locking without lock  [new]
test_2008
Member

Откуда: Москва
Сообщений: 1209
Серафимный Шестикрыл

"А мужики-то не знают !"


Если себя к ним причесляешь, то попросишь модера (или если ты сам модер) удалить своё хамство.
Твои нравоучения были не по делу и не имели отношения к вопросу.

Ещё раз повторюсь FOR UPDATE для задачи про количество не подходит.

Если ты хотел сказать что сама задача про количество поставлена криво то я уже отписал что согласен.
5 фев 09, 17:35    [6784939]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить