Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Oracle

Как одновременно получить и изменить значения поля таблицы? : Oracle

24.04.2024 2:39


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

Для чего это нужно: Например, разные процессы генерируют уникальные коды для неких объектов. Последний сгенерированный код храниться в неком поле некой таблице. Процесс считывает это поле, увеличивает его на единицу и записывает обратно. А если несколько процессов захотят сделать это одновременно, то они получат одно и тоже значение, что не допустимо. Задача этого избежать.
25.09.2014 11:23
OlegON
 
Использовать sequence? Или select for update? Подробностей мало.
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, время: 02:39.

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