`
whq
  • 浏览: 46760 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

讲解有关"SELECT FOR UPDATE"的一些概念

阅读更多
statement: 一个SQL语句。


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

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

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

LOCK的基本情况:

update, insert ,delete, select ... for update会LOCK相应的ROW 。

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

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


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

前面的FOR UPDATE省略,下面我们来讲一下OF。


transaction A运行
select a.object_name,a.object_id from wwm2 a,wwm3 b
2 where b.status='VALID' and a.object_id=b.object_id
3* 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
2 where b.status='VALID' and a.object_id=b.object_id
3* for update of b.status

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

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

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

当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待.返回错误是"ORA-00054: resource busy and acquire with NOWAIT specified"

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


FOR UPDATE WAIT 5

5秒后会出现提示:


ORA-30006: resource busy; acquire with WAIT timeout expired
FOR UPDATE NOWAIT SKIP LOCKED;

出现提示:


no rows selected
TABLE LOCKS
LOCK TABLE table(s) IN EXCLUSIVE MODE [NOWAIT];

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

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提示。
分享到:
评论

相关推荐

    mysql事务select for update及数据的一致性处理讲解

    如果不使用事务和`FOR UPDATE`,可能存在如下风险:在`SELECT`之后到`UPDATE`之前,其他事务可能已经将库存减少到0,但我们的事务仍然错误地更新了数量。为了解决这个问题,可以使用如下事务: 1. `SET AUTOCOMMIT=...

    PHP入门光盘教程详细的视频讲解

    7. **HTTP和Web基础知识**:了解HTTP协议的基本概念,以及如何使用PHP处理GET、POST等请求方式,同时讲解表单处理、URL编码和解码等Web开发相关知识。 8. **实战项目**:教程可能包含一些实际的小项目,如构建一个...

    ORACLE资料

    以上内容覆盖了Oracle基础语法的重要方面,包括SQL分类、`SELECT FOR UPDATE` 语句、`LOCK TABLE` 命令、动态 SQL 以及表连接等核心概念。通过掌握这些知识点,你可以更有效地管理和操作Oracle数据库中的数据。

    For.Dummies.SQL.All.in.One.Desk.Reference.For.Dummies.Jul.2007.pdf

    6. **插入、更新和删除**:讲解INSERT、UPDATE和DELETE语句,用于向表中添加、修改和删除数据。 7. **索引与优化**:讨论如何创建和使用索引以提高查询性能,以及SQL查询优化的基本策略。 8. **存储过程和触发器**...

    oracle锁讲解笔记

    DML语句(如INSERT、UPDATE、DELETE、MERGE和SELECT FOR UPDATE)在特定情况下可能导致阻塞。例如,两个会话试图向有唯一约束的表插入相同的值时,会引发阻塞。 - **死锁**:死锁是一种更严重的情况,其中两个或更...

    Beginning.SQL.Server.2005.for.Developers(English)

    首先,书中会讲解SQL Server 2005的基础知识,包括数据库的概念、关系模型、SQL语言的基本语法,如SELECT、INSERT、UPDATE、DELETE等操作,以及如何创建和管理数据库、表、索引等基本对象。这部分内容对于初学者来说...

    触发器讲解

    触发器是数据库管理系统中的一个重要概念,它主要用于实现更为复杂的数据完整性约束。不同于常规的存储过程,触发器不能直接被调用,而是通过特定的数据库操作(如插入、删除或修改)间接触发执行。这使得触发器在...

    基于oracle9i讲解SQL语言(来自网络)PDF中文教程

    此外,还会讲解SQL语言的基础语法,如SELECT语句用于查询数据,INSERT用于插入数据,UPDATE用于更新数据,以及DELETE用于删除数据。 **第2章 数据查询** 本章深入探讨了SQL的数据查询技巧,包括单表查询、多表联接...

    php6 mysql5 for dynamic websites

    1. 数据库基础:数据库的设计、创建和管理,以及SQL语言的基本语法,如SELECT、INSERT、UPDATE和DELETE。 2. 数据类型和约束:了解各种数据类型(如INT、VARCHAR、DATE等)及其适用场景,以及如何设置字段的约束条件...

    Plsql介绍及功能讲解

    以下是对PL/SQL及其相关知识点的详细讲解: 1. **SQL基础** - **简单查询**:SQL的基础是查询数据,`sql_简单查询.pdf`可能涵盖了如何使用SELECT语句从单一表中选择特定列、过滤行和聚合数据。 - **多表查询**:...

    ORACLE学习资料第五章.doc

    下面将详细讲解游标的相关知识点。 1. 隐式游标与%FOUND属性: Oracle中的隐式游标是指在执行DML(数据操纵语言)语句如INSERT、UPDATE、DELETE时,系统自动创建并使用的游标。%FOUND属性用于判断DML操作是否影响了...

    microsoft sql server 2005 programming for dummies

    本书会涵盖基本的SELECT、INSERT、UPDATE和DELETE语句,以及更复杂的子查询、联接操作和聚合函数的使用。 3. **存储过程和触发器**:存储过程是预编译的SQL语句集合,可以提高性能并简化复杂操作。触发器则在特定...

    oracle学习手册 很详细的讲解 非扫描完整书签版1431页

    3. **SQL基础**:讲解SQL语言的基本元素,如SELECT语句、INSERT、UPDATE、DELETE操作,以及如何创建、修改和删除表、视图、索引等数据库对象。 4. **PL/SQL编程**:详细介绍Oracle的编程语言PL/SQL,包括变量、常量...

    数据库系统教学课件:第8讲高级SQL.pptx

    在更新数据库记录时,可以使用带有`FOR UPDATE`子句的游标,例如 `DECLARE c CURSOR FOR SELECT * FROM instructor WHERE dept_name = 'Music' FOR UPDATE`。这允许在游标遍历过程中锁定当前行,以便后续的`UPDATE`...

    MySQL Reference Manual for version

    对于初学者来说,《MySQL Reference Manual for version》是一个很好的起点,它以简洁明了的方式讲解了MySQL的关键概念和技术,有助于快速上手数据库管理。随着经验的积累,这本书也将成为查阅特定问题的宝贵资源。

    SQL语法大全.rar

    本教程“SQL语法大全”不仅涵盖了这些基本概念,还可能深入讲解了SQL优化、性能调优、安全策略等相关内容,以满足不同层次的学习需求。通过学习,你可以熟练掌握SQL语言,从而在数据库管理、数据分析等领域游刃有余...

    Oracle SQL优化实例讲解.pdf

    通过上述知识点的详细说明,我们可以了解到Oracle SQL优化涉及多个层面的内容,从具体的优化技巧到理论概念,从基本的操作到高级的性能分析工具,每一个环节都是优化过程中不可或缺的一环。通过实例讲解,能够更加...

    SQL详细讲解——visuaC#

    在探讨“SQL详细讲解——visualC#”这一主题时,我们首先需要澄清,标题中提及的“visualC#”似乎与SQL本身没有直接关联。Visual C#是Microsoft .NET框架的一部分,主要用于创建Windows桌面应用程序、Web应用程序...

Global site tag (gtag.js) - Google Analytics