`
xubaolin9
  • 浏览: 96728 次
社区版块
存档分类
最新评论

[转]Oracle For update研究

阅读更多

http://www.cnblogs.com/zping/archive/2009/01/06/1370245.html

 

 

 写道
1 select * from hjh for update [of hjh.a]; 锁定表的所有行
   可以select,insert,不可以update,Delete Commit提交后,解除锁定
2 SELECT * FROM hjh WHERE a = 1 FOR UPDATE [of hjh.a]; 只锁定a=1的行
3 SELECT a.a, t1.d FROM hjh a, t1 WHERE a.a = t1.c [and a.a = 2] FOR UPDATE;锁定两个表的中满足条件的行
4 SELECT a.a, t1.d FROM hjh a,t1 WHERE a.a = t1.c [and a.a = 2] FOR UPDATE OF a.a; 只锁定hjh中满足条件的行
加行级共享锁,然后以独占方式进行修改数据(update,delete),
你FOR UPDATE 的时候 ,其他人不能更改你查询出来的记录
commit和rollback都可以释放锁

DML锁包括table-level locks(TM)和Row-level locks(TX)
说明row-level lock(TX type)是为了确保其它用户不可以在相同的时间修改相同的行
TM 是对象锁,表示可能在这个对象上做了什么操作,还没有结束,所以不允许ddl
TX 是事务锁,表示发起了一个事务,发起事务的判别标准

 

 

Oracle 的for update行锁

http://hi.baidu.com/mcj0127/blog/item/111a900777db06c87b89473c.html

 

SELECT FOR UPDATE 相关的知识

一个邮件发送的应用会每过一定的时间片去数据库中取未发的邮件然后发送邮件,成功后将数据库中邮件标识未发改为已发。

这个应用部署在websphere上,websphere采用是垂直克隆,有4个server,当4个server都开启的时候,就出现同时发4封相同的邮件给同一个用户。

这时,for update锁就可以解决这个问题!

1:状态解释

statement: 一个SQL语句。

session:     一个由ORACLE用户产生的连接,一个用户可以产生多个SESSION ,但相互之间是独立的。

transaction:所有的改变都可以划分到transaction里,一个transaction包含一个或多个SQL。当一个SESSION建立的时候就是一个TRANSACTION开始的时刻,此后   transaction的开始和结束由DCL控制,也就是每个COMMIT/ROLLBACK都标示着一个transaction的结束。

consistency:是对于statement级别而不是transaction级别来说的。sql statement 得到的数据都是以sql statement开始的IMAGE。

 

2:sql解释

LOCK的基本情况: update, insert ,delete, select ... for update会LOCK相应的ROW 。

只有一个TRANSACTION可以LOCK相应的行,也就是说如果一个ROW已经LOCKED了,那就不能被其他TRANSACTION所LOCK了。

LOCK由statement产生但却由TRANSACTION(commit,rollback)结尾,也就是说一个SQL完成后LOCK还会存在,只有在COMMIT/ROLLBACK后LOCK才会RELEASE。

 

        SELECT.... FOR UPDATE [OF cols] [NOWAIT];

OF cols: SELECT cols FROM tables [WHERE...] FOR UPDATE [OF cols] [NOWAIT];

3:sql说明

a:关于OF

transaction A运行

select a.object_name,a.object_id from wwm2 a,wwm3 b where b.status='VALID' and a.object_id=b.object_id for update of a.status

则transaction B可以对b表wwm3的相应行进行DML操作,但不能对a表wwm2相应行进行DML操作.

 

反一下看看

transaction A运行

select a.object_name,a.object_id from wwm2 a,wwm3 b where b.status='VALID' and a.object_id=b.object_id for update of b.status

则transaction B可以对a表wwm2的相应行进行DML操作,但不能对b表wwm3相应行进行DML操作.

也就是说LOCK的是行,只是如果不加OF的话会对所有涉及的表LOCK的,加了OF后只会LOCK OF 字句所在的TABLE.

 

b:关于NOWAIT(如果一定要用FOR UPDATE,我更建议加上NOWAIT)

当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并 立即结束 STATEMENT而不再等待).返回错误是"ORA-00054: resource busy and acquire with NOWAIT pecified"

 

 

注另外如下用法也值得推荐,应该酌情考虑使用。

1:FOR UPDATE WAIT 5

5秒后会提示ORA-30006: resource busy; acquire with WAIT timeout expired

2:FOR UPDATE NOWAIT SKIP LOCKED;

会提示no rows selected 

3:TABLE LOCKS   

LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];

同样也是在transaction结束时才会释放lock。

4:DEADLOCK

transaction a lock rowA     , then transaction b lock rowB

then transaction a tries to lock rowB, and transaction b tries to lock rowA

也就是说两个transaction都相互试图去lock对方已经lock的ROW,都在等待对方释放自己的lock,这样就使死锁。

deadlock也会有600提示。

分享到:
评论

相关推荐

    oracle的update的五种方式

    标准 Update 语句是 Oracle 中最基本的更新语句,语法为:`UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值`。例如:`UPDATE t_join_situation SET join_state='1' WHERE year='2011'`。这种方式适用于更新...

    oracle-j2sdk1.8-1.8.0+update181-1.x86_64_百度云资源.txt

    CDH6.3.1/CDH6.3.2官方建议jdk

    C#连接oracle数据库实例

    可以通过NuGet包管理器或者直接下载Oracle Developer Tools for Visual Studio来获取这个库。 接下来,我们需要创建一个C#项目,并通过NuGet添加对Oracle.ManagedDataAccess的引用。在Visual Studio中,打开项目,...

    Oracle 教案.rar

    这个Oracle教案可能通过案例研究、练习和解答来强化这些概念,使学习者能够实际操作并理解Oracle数据库的工作原理。对于想要提升数据库技能或准备Oracle相关认证考试的人来说,这是一个非常宝贵的资源。

    有关Oracle封锁机制的研究

    ### 有关Oracle封锁机制的研究 #### 1. 引言:数据库锁的基本概念 数据库管理系统(DBMS)通过引入锁机制来确保并发用户访问同一数据库对象时的正确性和一致性。锁机制能够防止数据丢失、实现可重复读以及避免读取未...

    Oracle Database 19c (WINDOWS.X64-193000-examples.zip)

    通过深入研究"examples"目录下的文件,用户不仅可以学习Oracle Database 19c的理论知识,还可以通过实际操作来增强对数据库管理的理解,提升技能水平。同时,这些示例也是初学者和开发人员宝贵的参考资料,有助于...

    oracle练习题关于触发器的作业

    Oracle数据库是世界上最流行的数据库管理系统之一,尤其在企业级应用中占据主导地位。它拥有丰富的功能,其中触发器(Triggers)是实现复杂业务逻辑...请仔细研究每个题目,逐步解答,不断实践,相信你会从中受益匪浅。

    Oracle语法大全

    以上只是Oracle语法大全中的部分关键知识点,实际学习中还需要结合具体场景和实践进行深入研究。通过《Oracle知识库》.CHM文件,你可以找到更详尽的信息,包括实例、错误处理和最佳实践等内容,帮助你成为一名精通...

    Oracle数据库锁的研究.pdf

    行级锁在事务对数据行进行修改时自动获取,如INSERT、UPDATE、DELETE和SELECT...FOR UPDATE语句会引发行级锁。TX锁在事务开始修改时获得,直到事务提交或回滚才释放。 - DDL锁(Data Definition Language Locks):...

    oracle经典教程

    综上所述,Oracle不仅是一款功能强大的数据库管理系统,也是一门值得深入研究的技术学科。通过学习Oracle的经典教程,不仅可以掌握数据库的基础操作,还能深入了解其高级特性和最佳实践,为成为一名优秀的数据库管理...

    Oracle多粒度封锁机制研究

    当事务首次执行修改操作或使用SELECT...FOR UPDATE查询时,会获取一个TX锁,这个锁在整个事务期间保持,直到事务提交(COMMIT)或回滚(ROLLBACK)。因此,一个TX锁可能对应多个被锁定的数据行。行级锁的实现不依赖...

    论文研究-访问Oracle大对象数据的技术及实现.pdf

    - LOB数据的锁定与事务管理:利用`SELECT FOR UPDATE`语句锁定LOB记录,以及通过事务提交确保数据的一致性。 ### 使用COM组件接口访问Oracle LOB数据 本研究通过开发COM组件接口,实现了在Web应用程序中对Oracle ...

    oracle 10 Ora 10G 官方文档

    Oracle 10g是Oracle公司推出的数据库管理系统的一个重要版本,主要关注高性能、高可用性和安全性。...通过深入研究这些资料,无论是初学者还是经验丰富的DBA,都能增强对Oracle数据库系统的理解和应用能力。

    oracle多粒度封锁机制研究(论坛

    TX锁代表事务锁,当一个事务首次执行数据更改(如INSERT、UPDATE、DELETE操作)或使用`SELECT...FOR UPDATE`语句进行查询时,该事务会获得一个TX锁,并且这个锁将持续到该事务结束(通过执行COMMIT或ROLLBACK操作...

    更改Oracle表中字段的顺序的终极方法

    幸运的是,经过一番研究与探索后发现,实际上有一种更加简便的方式来实现这一需求——无需重建表即可完成字段顺序的调整。本文将详细介绍如何使用这种方法,并提供具体的步骤及代码示例。 #### 背景介绍 在Oracle...

    Oracle9i&10g编程艺术脚本

    通过深入研究"Oracle9i&10g编程艺术脚本",你将能够掌握这些核心概念,提高在Oracle数据库环境中的编程和管理能力。这些技能对于任何需要与Oracle数据库打交道的IT专业人员来说都是至关重要的。同时,理解这些基础...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。  ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用...

    oracle完全手册

    熟悉常用的SQL开发工具,如Oracle SQL Developer、Toad for Oracle和PL/SQL Developer,可以提高SQL编写和调试的效率。 #### SELECT语句详解 SELECT语句是SQL中最常用的操作之一,用于从数据库中检索数据。了解...

    Oracle编程入门经典覆盖至Oracle9i版本

    总结起来,Oracle编程入门涵盖的内容广泛,从基础的SQL语言和PL/SQL编程,到Oracle9i的特色功能,再到数据库管理和性能优化,每个部分都值得深入研究。通过不断学习和实践,你将能够熟练掌握Oracle数据库系统,为你...

Global site tag (gtag.js) - Google Analytics