Oracle中select ... for update的用法
语法: SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED]; 其中OF子句用于指定即将更新的列,即锁定行上的特定列;WAIT子句指定等待其他用户释放锁的秒数,防止无限期的等待。 使用“FOR UPDATE WAIT”子句的优点如下: 1防止无限期地等待被锁定的行; 2允许应用程序中对锁的等待时间进行更多的控制。 3对于交互式应用程序非常有用,因为这些用户不能等待不确定 4若使用了skip locked,则可以越过锁定的行,不会报告由wait n引发的‘资源忙’异常报告 实验: create table t(a varchar2(20),b varchar2(20)); insert into t values('1','1'); insert into t values('2','2'); insert into t values('3','3'); insert into t values('4','4'); insert into t values('5','5'); insert into t values('6','6'); (1)在PLSQL Developer中打开两个窗口,在窗口1中执行 select * from t where a='1' for update; 结果如下 在窗口2中执行 select * from t where a='1'; 结果如下 可见此时能正常查询。 在窗口2中执行 select * from t where a='1' for update; 发现无法查询出结果且PLSQL Developer的执行按钮一直为灰色。 这是因为表被窗口1里的语句锁住了,窗口2处于等待状态。 只有等窗口1中提交了事务之后才能在窗口2中正常执行上述语句。 在窗口1中点击提交事务的按钮后,窗口2中立马显示出正常结果 把窗口1和2中未提交的事务都提交,以便进行下一步的实验。 (2) 在窗口1中执行select * from t where a='1' for update; 在窗口2中执行select * from t where a='1' for update nowait; 立马报资源正忙的错误: 关掉上面的错误提示窗口,在窗口2中执行 select * from t where a='1' for update wait 6; 则6秒之后报错: 关掉上面的错误提示,在窗口2中执行 select * from t where a='1' for update skip locked; 则既不等待,也不报错,也查询不出结果: 把窗口1和2中未提交的事务都提交,以便进行下一步的实验。 (3) 在窗口1中执行: select * from t where rownum<=3 for update skip locked; 结果如下: 在窗口2中执行: 结果如下: 可见前三条数据因被窗口1锁住而没有查出来。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |