实际工作中需要用到游标锁所以就google了又google,找到一些资料,下面贴出来一篇觉得还不错的文章: from http://hi.baidu.com/eebevkrtwgbgxzd/item/224ad35f525ec0cfd2e10c14
如下代码:
declare
-- query emp.name
cursor cur_emp
is
select empno, ename, job
from emp
where empno = 7369
for update of ename;
begin
for return_cur in cur_emp
loop
update emp
set ename = 'LHG'
where current of cur_emp;
end loop;
end;
其中的for update of ename意思是给表中的行加锁,经过测试,后面的ename可以写成该表中的任何字段,因为oracle中锁的最低级别是行锁,不存在给字段加锁。
下面是行锁的作用:
1.行锁开始于一个CURSOR的OPEN,结束于一个提交COMMIT或ROLLBACK,而并不是结束于一个CURSOR的结束(CLOSE)。
2.当在一个CURSOR中对某个表的行加锁,那么如果在这个SESSION中用另一个CURSOR操作该行记录时候会等待第一个cursor的完成提交,直到第一个cursor提交完成之后,第二个cursor中对改行的操作才会开始执行。
3.当第一个cursor中的由于操作错误而不能提交时候,第二个cursor将会一直等待下去,这样就形成了死锁。预防这种情况发生的方法是在for update of ename 之后指定NOWAIT选项,这样的话,当第二个cursor不会一直等待下去,而是出现ORA-00054 [resource busy and acquire with NOWAIT specified]的
讯息。
4.既然for update of后面的字段是随便那个字段都可以,那么可不可以不写呢?如果你没必要指定NOWAIT选项,那么后面的字段就可以不写;如果你必须指定NOWAIT选项,则必须指定至少一个字段。
5.还有一种方法是用ROWID替代WHERE CURRENT OF YOUR_CURSOR_NAME语句。
如下代码:
declare
-- query emp.name
cursor cur_emp
is
select a.deptno,
a.dname,
a.rowid,
b.rowid rowid_1
from dept a, emp b
where empno = 7369
and a.deptno = b.deptno
for update nowait;
-- local variables
v_deptno dept.deptno%type;
v_dname dept.dname%type;
v_rowid rowid;
v_rowid_1 rowid;
begin
open cur_emp;
loop
fetch cur_emp into v_deptno, v_dname, v_rowid, v_rowid_1;
exit when cur_emp%notfound;
update dept
set dname = 'abc'
where rowid = v_rowid;
update emp
set ename = 'frank'
where rowid = v_rowid_1;
end loop;
close cur_emp;
commit;
exception
when others then
rollback;
raise;
end;
由此,推荐的for update的习惯是:
NOWAIT定然跟FOR UPDATE之后。
直接用ROWID替代WHERE CURRENT OF YOUR_CURSOR_NAME语句,
尤其在相对繁习的程序里头。
COMMIT必需存在程序结尾。以防死锁成形。
EXCEPTION里的ROLLBACK是最基本的需要。
分享到:
相关推荐
菜鸟入侵--利用资源搜索动画教程,内附有详细的使用说明 菜鸟入侵之利用资源篇 菜鸟在入侵的时候,如果能充分利用现有的资源,那将对自己的入侵起很大的
菜鸟到老鸟-教你玩转Mac操作
cx_Oracle-5.0.4-11g.win-amd64-py2.7.msi
手打从菜鸟到入门--电脑篇 此文章推荐刚刚接触电脑的朋友们阅读,书籍会更新,属于网络文章,相信对大多数网友会有帮助!
在《职场菜鸟升职记》这部作品中,作者通过主人公的视角展现了作为一名职场新人所应有的态度。开篇即强调“我是菜鸟”的心态,这种心态不仅意味着对自身能力的认知和定位,更是一种积极向上、勇于学习的态度。它鼓励...
STM32菜鸟学习手册-罗嗦版 。
菜鸟飞飞飞-微服务架构的想法
《Delphi7教程之菜鸟先飞版--帮你打通任督二脉(第1式)》是一份专为初学者设计的教程,旨在帮助新手快速掌握Delphi7编程的基础知识和技巧。Delphi7是一款强大的Windows应用程序开发工具,以其高效的代码生成、直观的...
【标题】"菜鸟成长史-Web网页设计-MIUI10网页模仿.zip" 提供了一个初学者在Web网页设计领域的学习案例,特别是针对MIUI10界面风格的模仿。这通常意味着我们将探讨HTML(超文本标记语言)和前端开发技术。 【描述】...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它在企业级应用中扮演着核心角色。本文将详细讲解如何在Linux环境下安装Oracle,以及如何配置Oracle透明网关连接SQL Server,同时还会探讨大量数据...
菜鸟玩破解--BT5_中文版破解WPA2_WPA简单过程教程 如题,简单的WPA2_WPA破解过程教程,首先下载BT5_中文版,然后按图示进行。
《CCNA菜鸟笔记640-802》是一份针对初学者的全面学习资源,包含两部分:《CCNA菜鸟笔记2007修正版》和《CCNA 640-802课程讲义》。这些文档旨在帮助读者理解和掌握Cisco Certified Network Associate(CCNA)认证考试...
中国移动-杨琛-从菜鸟到骨灰-研发质量管理和测试效能演进之路
本oracle菜鸟的一次oracle恢复笔记
10. 取样误差和置信区间:理解样本与总体之间的差异,学会计算置信区间,对总体参数进行估计。 11. 偏态和峰态:了解数据分布的偏斜程度和尖峭程度,这对理解数据的形状至关重要。 在实际操作中,你可能会用到配套...
10. **单元测试**:使用JUnit等测试框架进行单元测试,确保代码的正确性和可靠性,提高系统的质量。 以上就是基于SpringBoot、Oracle、Java-Swing的职工考勤管理信息系统的主要技术点和功能模块,通过这些技术的...
Bootstrap是一个流行的前端框架,用于快速开发响应式布局的网站。根据给定的文件信息,我们可以提取以下知识点: 1. **Bootstrap版本特性**:文件提到了Bootstrap3版本的一些关键特性,如移动设备优先的设计目标。...
《少儿编程Scratch项目:菜鸟闯关》 在当今信息化社会,编程教育逐渐成为孩子们学习的新领域,Scratch作为一款由麻省理工学院(MIT)设计开发的面向儿童的图形化编程工具,以其直观易懂的特性深受广大少年儿童的...
这个"2018Bootstrap-菜鸟离线教程-支持导航直接跳转-支持可视化布局"的资源包,显然是为初学者设计的,旨在帮助他们离线学习Bootstrap的基础和高级特性,特别强调了导航功能的直接跳转以及可视化布局的设计。...
在“小菜鸟系列-Oracle的优化器与hint”这个主题中,我们将深入探讨Oracle数据库的查询优化器以及如何通过使用hint来引导优化器进行更高效的执行计划选择。 Oracle的优化器是数据库引擎的核心组件,它负责分析SQL...