Необходимо убедиться, что для autocommit
установлено значение false в вашем соединении. Это ключ. Тогда вы бы сделали следующие шаги:
Сделайте свой выбор с предложением for update в конце (выберите column1, column2 из mytable для обновления). Это заблокирует ряд.
Выполните запрос на обновление.
Выпустить явный коммит, который снимет блокировку строки.
Конечно, помните, что блокировка строки просто блокирует ее от модификации. Другой сеанс все еще может запросить эти строки. Например, если это был идентификатор, а способ получения нового идентификатора состоял в том, чтобы запросить таблицу, выполнив select max(id) + 1 from table
. Блокировка строки не помешает другому сеансу выполнить этот выбор.
Еще лучше было бы пропустить выбор и обновить записи на месте и использовать предложение returning
, чтобы вернуть вам новые обновленные значения. Я никогда не делал этого в Ruby OCI8, поэтому я не уверен, поддерживает ли он эту функцию. Документы для этого предложения в обновлении находятся здесь:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10007.htm#i2126358