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

Для чего это нужно: Например, разные процессы генерируют уникальные коды для неких объектов. Последний сгенерированный код храниться в неком поле некой таблице. Процесс считывает это поле, увеличивает его на единицу и записывает обратно. А если несколько процессов захотят сделать это одновременно, то они получат одно и тоже значение, что не допустимо. Задача этого избежать.
 
25.09.2014 11:23  
OlegON
Использовать sequence? Или select for update? Подробностей мало.
 
"Спасибо" OlegON от:
25.09.2014 11:45  
Pyatak
Правильно ли я понимаю, что
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  
Pyatak
Нашел, что это вроде как надо делать в рамках транзакции. Записи освобождаются после завершения транзакции.
 
25.09.2014 11:55  
OlegON
UPDATE поставит на нее свою блокировку, потом ты закоммитишь и все снимется. Только я sequence вперед не зря выставил...
 
25.09.2014 12:54  
Pyatak
Если бы я базу с нуля проектировал, то использовал бы. А так, приходится отталкиваться от существующих таблиц.
 
26.09.2014 10:00  
bayan
Использоватьselect for update. Он повесит блокировку. Передумали изменять - rollback.
 
 
Опции темы



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

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