выберите для обновления с ruby ​​oci8 - PullRequest
1 голос
/ 17 апреля 2010

как мне сделать «выбрать для обновления» и затем «обновить» строку, используя ruby ​​oci8.

У меня есть два поля counter1 и counter2 в таблице, в которой есть только 1 запись. Я хочу выбрать значения из этой таблицы, а затем увеличить их, заблокировав строку, используя команду select for update.

спасибо.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2010
select_stmt = conn.prepare('select * from table_name for update')
select_stmt.exec
while row = select_stmt.fetch
  conn.exec('update table_name set col = :1 where rowid = :2', 'val', select_stmt.rowid)
end
0 голосов
/ 17 апреля 2010

Необходимо убедиться, что для autocommit установлено значение false в вашем соединении. Это ключ. Тогда вы бы сделали следующие шаги:

  1. Сделайте свой выбор с предложением for update в конце (выберите column1, column2 из mytable для обновления). Это заблокирует ряд.

  2. Выполните запрос на обновление.

  3. Выпустить явный коммит, который снимет блокировку строки.

Конечно, помните, что блокировка строки просто блокирует ее от модификации. Другой сеанс все еще может запросить эти строки. Например, если это был идентификатор, а способ получения нового идентификатора состоял в том, чтобы запросить таблицу, выполнив select max(id) + 1 from table. Блокировка строки не помешает другому сеансу выполнить этот выбор.

Еще лучше было бы пропустить выбор и обновить записи на месте и использовать предложение returning, чтобы вернуть вам новые обновленные значения. Я никогда не делал этого в Ruby OCI8, поэтому я не уверен, поддерживает ли он эту функцию. Документы для этого предложения в обновлении находятся здесь:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10007.htm#i2126358

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...