Oracle中select ... for update的用法

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中执行:
select * from t where rownum<=6 for update skip locked;

结果如下:


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

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29485627/viewspace-1291675/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29485627/viewspace-1291675/

已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
程序员的必经之路! 【限时优惠】 现在下单,还享四重好礼: 1、教学课件免费下载 2、课程案例代码免费下载 3、专属VIP学员群免费答疑 4、下单还送800元编程大礼包 【超实用课程内容】  根据《2019-2020年国开发者调查报告》显示,超83%的开发者都在使用MySQL数据库。使用量大同时,掌握MySQL早已是运维、DBA的必备技能,甚至部分IT开发岗位也要求对数据库使用和原理有深入的了解和掌握。 学习编程,你可能会犹豫选择 C++ 还是 Java;入门数据科学,你可能会纠结于选择 Python 还是 R;但无论如何, MySQL 都是 IT 从业人员不可或缺的技能!   套餐一共包含2门MySQL数据库必学的核心课程(共98课时)   课程1:《MySQL数据库从入门到实战应用》   课程2:《高性能MySQL实战课》   【哪些人适合学习这门课程?】  1)平时只接触了语言基础,并未学习任何数据库知识的人;  2)对MySQL掌握程度薄弱的人,课程可以让你更好发挥MySQL最佳性能; 3)想修炼更好的MySQL内功,工作遇到高并发场景可以游刃有余; 4)被面试官打破沙锅问到底的问题问到怀疑人生的应聘者。 【课程主要讲哪些内容?】 课程一:《MySQL数据库从入门到实战应用》 主要从基础篇,SQL语言篇、MySQL进阶篇三个角度展开讲解,帮助大家更加高效的管理MySQL数据库。 课程二:《高性能MySQL实战课》主要从高可用篇、MySQL8.0新特性篇,性能优化篇,面试篇四个角度展开讲解,帮助大家发挥MySQL的最佳性能的优化方法,掌握如何处理海量业务数据和高并发请求 【你能收获到什么?】  1.基础再提高,针对MySQL核心知识点学透,用对; 2.能力再提高,日常工作的代码换新貌,不怕问题; 3.面试再加分,巴不得面试官打破沙锅问到底,竞争力MAX。 【课程如何观看?】  1、登录CSDN学院 APP 在我的课程进行学习; 2、移动端:CSDN 学院APP(注意不是CSDN APP哦)  本课程为录播课,课程永久有效观看时长 【资料开放】 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化。  下载方式:电脑登录课程观看页面,点击右侧课件,可进行课程资料的打包下载。
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页