У Oracle есть хороший способ справиться с этим, но я не знаю, насколько он универсален.
В Oracle вы можете использовать FOR UPDATE в операторе SELECT, чтобы заблокировать запись при ее чтении.
Например, если вы выбираете строку для отображения:
select * into v_row from my_table where my_table_id = 1
for update;
Это разрешит чтение, но предотвратит обновления. Если другая транзакция имеет блокировку, ваша транзакция будет ждать, пока она не станет доступной (или, в конце концов, истечет время ожидания). Если вы хотите, чтобы оператор выдавал исключение при попытке блокировки, добавьте NOWAIT.
select * into v_row from my_table where my_table_id = 1
for update nowait;
Если строка уже заблокирована, вы получите:
ORA-00054: resource busy and acquire with NOWAIT specified.
Надеюсь, это поможет.
person
Nick Pierpoint
schedule
29.10.2008