[ОТВЕТИТЬ]
Опции темы
25.09.2014 11:07
 
Возможно ли в Оракле одновременно получить и изменить значение поля в таблице? Ну или сначала получить, потом изменить, но что бы в промежутке этих двух операций ни кто другой это значение не получил и не изменил?

Для чего это нужно: Например, разные процессы генерируют уникальные коды для неких объектов. Последний сгенерированный код храниться в неком поле некой таблице. Процесс считывает это поле, увеличивает его на единицу и записывает обратно. А если несколько процессов захотят сделать это одновременно, то они получат одно и тоже значение, что не допустимо. Задача этого избежать.
25.09.2014 11:23
 
Использовать sequence? Или select for update? Подробностей мало.
"Спасибо" OlegON от:
25.09.2014 11:45
 
Правильно ли я понимаю, что
SELECT lastid FROM tablename WHERE key=1 FOR UPDATE
заблокирует строчку в таблице для чтения и записи, а
UPDATE tablename SET lastid=xx WHERE key=1
её разблокирует?
И не надо ни каких дополнительных команд?

А если я после 'SELECT FOR UPDATE' передумаю обновлять данные, как разблокировать?
В любом случае, спасибо за наводку, это то что нужно, погуглю ещё.
25.09.2014 11:53
 
Нашел, что это вроде как надо делать в рамках транзакции. Записи освобождаются после завершения транзакции.
25.09.2014 11:55
 
UPDATE поставит на нее свою блокировку, потом ты закоммитишь и все снимется. Только я sequence вперед не зря выставил...
25.09.2014 12:54
 
Если бы я базу с нуля проектировал, то использовал бы. А так, приходится отталкиваться от существующих таблиц.
26.09.2014 10:00
 
Использоватьselect for update. Он повесит блокировку. Передумали изменять - rollback.
Опции темы



Часовой пояс GMT +3, время: 20:27.

Все в прочитанное - Донат - RSS - - Карта - Вверх

Форум сделан на основе vBulletin®
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.