У 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.
Надеюсь, это поможет.