如何使用ruby oci8进行“select for update”然后“更新”该行。
我在一个只有1条记录的表中有两个字段counter1和counter2。我想从这个表中选择值,然后通过使用select for update锁定行来增加它们。
感谢。
答案 0 :(得分:0)
您需要确保连接上的autocommit
设置为false。这是关键。然后,您将执行以下步骤:
在结尾处使用for update子句进行选择(从mytable中选择column1,column2进行更新)。这将锁定该行。
执行更新查询。
发出一个显式提交,它会释放该行的锁定。
当然记住锁定行只是将其锁定而不是修改。另一个会话仍然可以查询这些行。例如,如果这是一个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