使用ruby oci8选择更新

时间:2010-04-16 22:14:59

标签: sql ruby database oracle

如何使用ruby oci8进行“select for update”然后“更新”该行。

我在一个只有1条记录的表中有两个字段counter1和counter2。我想从这个表中选择值,然后通过使用select for update锁定行来增加它们。

感谢。

2 个答案:

答案 0 :(得分:0)

您需要确保连接上的autocommit设置为false。这是关键。然后,您将执行以下步骤:

  1. 在结尾处使用for update子句进行选择(从mytable中选择column1,column2进行更新)。这将锁定该行。

  2. 执行更新查询。

  3. 发出一个显式提交,它会释放该行的锁定。

  4. 当然记住锁定行只是将其锁定而不是修改。另一个会话仍然可以查询这些行。例如,如果这是一个ID,并且获取新ID的方法是查询执行select max(id) + 1 from table的表。锁定该行不会阻止另一个会话执行此选择。

    更好的是跳过select并更新记录并使用returning子句返回新的更新值。我从来没有在Ruby OCI8中完成它,所以我不确定它是否支持该功能。更新中该子句的文档位于:

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

答案 1 :(得分:0)

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