Oracle中select ... for update的用法

语法:

SELECT... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];

其中OF 子句用于指定即将更新的列,即锁定行上的特定列;WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

使用“FORUPDATE WAIT”子句的优点如下:

1防止无限期地等待被锁定的行;

2允许应用程序中对锁的等待时间进行更多的控制。

3对于交互式应用程序非常有用,因为这些用户不能等待不确定

4若使用了skip locked,则可以越过锁定的行,不会报告由wait n引发的‘资源忙’异常报告


实验:

createtable t(a varchar2(20),b varchar2(20));

insertinto t values('1','1');

insertinto t values('2','2');

insertinto t values('3','3');

insertinto t values('4','4');

insertinto t values('5','5');

insertinto t values('6','6');


(1)在PLSQL Developer中打开两个窗口,在窗口1中执行

select* from t where a='1' for update;

结果如下

1.jpg

2014-10-8 14:26 上传
下载附件 (24.67 KB)


在窗口2中执行

select* from t where a='1';

结果如下

2.jpg

2014-10-8 14:24 上传
下载附件 (23.48 KB)

可见此时能正常查询。


在窗口2中执行

select* from t where a='1' for update;

发现无法查询出结果且PLSQLDeveloper的执行按钮一直为灰色。

3.jpg

2014-10-8 14:25 上传
下载附件 (68.01 KB)


这是因为表被窗口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;

立马报资源正忙的错误:

4.png

2014-10-8 14:26 上传
下载附件 (25.9 KB)


关掉上面的错误提示窗口,在窗口2中执行

select* from t where a='1' for update wait 6;

则6秒之后报错:

5.png

2014-10-8 14:27 上传
下载附件 (27.09 KB)


关掉上面的错误提示,在窗口2中执行

select * from t where a='1' for update skiplocked;

则既不等待,也不报错,也查询不出结果:

6.png

2014-10-8 14:27 上传
下载附件 (54.86 KB)


把窗口1和2中未提交的事务都提交,以便进行下一步的实验。


(3)

在窗口1中执行:

select* from t where rownum<=3 for update skip locked;

结果如下:

7.png

2014-10-8 14:28 上传
下载附件 (63.21 KB)


在窗口2中执行:
select * from t where rownum<=6 for update skip locked;

结果如下:

8.jpg

2014-10-8 14:29 上传
下载附件 (26.25 KB)

可见前三条数据因被窗口1锁住而没有查出来。

转自 http://www.itpub.net/thread-1891268-1-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值