0 0

子查询语句怎么就 锁定连接呢?30

select count(*) from Wisher where createdTimestamp <= (select
createdTimestamp from Wisher where wisherId = 123) for update

这句话是查询123 这个ID 创建时间之前的记录数
然后我遇到了并发的问题后 就直觉性的加了 for update

我对里面的机制不了解,高手们 帮忙分析下原理
DAO 
2009年12月21日 12:44

2个答案 按时间排序 按投票排序

0 0

采纳的答案

我觉得这篇文章解释的就比较详细了 呵呵

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提示。

2009年12月21日 13:20
0 0

要加并发锁楼上说的应该可以了

2009年12月22日 08:43

相关推荐

    MySql执行一条查询语句的内部执行过程?

    它考虑多种可能的执行计划,如索引的选择、连接顺序、子查询的处理方式等,并根据统计信息和成本估算来决定最优方案。MySQL有基于规则的优化和基于成本的优化两种策略。 4. **执行计划(Execution Plan)**:优化器...

    01.基础架构:一条SQL查询语句是如何执行的?.pdf

    从文件内容可知,本文主要讲述了MySQL数据库的基础架构以及一条SQL查询语句在MySQL中的执行过程。为了深入理解,我们首先需要了解MySQL的整体逻辑架构,并且探讨其中各个组件的具体作用。 MySQL的架构可以分为两大...

    精通sql结构化查询语句

    9.6.2 内连接与右外连接的综合应用 9.6.3 UNION集合运算与多表连接应用 9.7 小结第10章 子查询 10.1 子查询的简单应用 10.1.1 子查询概述 10.1.2 在多表查询中使用子查询 10.1.3 在子查询中使用聚合函数 10.1.4 使用...

    SQL 查询语句优化

    ### SQL查询语句优化策略详解 #### 一、选择最有效率的表名顺序 在基于规则的优化器中,如Oracle,SQL语句中表的处理顺序至关重要。Oracle的解析器遵循从右至左的处理逻辑,因此,位于FROM子句最右侧的表将被最先...

    关于Oralce数据库的SQL查询语句优化探究.pdf

    3. **减少子查询**:合并子查询为单个查询,或者使用连接(JOIN)操作,可以降低查询复杂度。 4. **合理使用聚合函数**:避免在WHERE子句中使用聚合函数,这可能导致全表扫描。 5. **优化连接操作**:手动指定表的...

    SQL 语句大全 SQL 语句大全

    - **子查询**:在主查询内部嵌套的查询,可以用来比较、过滤或计算。 3. **DDL语句** - **创建表**:CREATE TABLE语句定义表的结构,包括字段名、数据类型、约束条件等。 - **修改表**:ALTER TABLE语句用于添加...

    sql中的select语句查询介绍

    在实际应用中,`SELECT`语句的复杂性可以随着需求的增长而增加,包括子查询、联接(如内连接、外连接、自身连接)、合并(UNION)等。了解并熟练掌握`SELECT`语句的各种用法,是成为有效数据库查询者的基石。 总之...

    oracle的SQL语句的一些经验总结

    4. **子查询**:在SQL中,一个查询可以嵌套在另一个查询中,形成子查询。子查询可以作为SELECT,FROM或WHERE子句的一部分,用于获取满足特定条件的数据。 5. **分组(GROUP BY)与HAVING**:GROUP BY用于将数据按一...

    sql语句学习大全

    3. **子查询与联接**:子查询是在SELECT语句中嵌套的查询,用于获取其他查询所需的数据。联接(JOIN)语句用于合并来自多个表的数据,包括内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)以及自连接...

    彻底优化 PL/SQL 语句

    考虑将子查询转换为连接,或者使用存在的索引来改善性能。 5. **使用绑定变量**:使用绑定变量而非硬编码值,可以减少解析次数,从而降低解析开销,提高执行计划的复用性。 6. **减少排序和分组**:ORDER BY和...

    SQL语句执行深入讲解(MySQL架构总览-查询执行流程-SQL解析顺序)

    3. 对于SELECT查询,MySQL会使用查询优化器生成执行计划,考虑各种可能的执行路径,如索引选择、连接顺序、子查询优化等,以达到最快的执行速度。 4. 接下来,执行计划会被执行,访问控制模块检查用户权限,表管理...

    高效SQL的语句

    虽然子查询在某些情况下非常有用,但它们通常比等效的连接操作更慢,因为子查询可能需要多次执行。如果可能,应尝试将子查询转换为JOIN操作,或者使用窗口函数和集合运算符(如IN、EXISTS)来替代。 #### 3.3 利用...

    SQLServer语句优化.rar

    9. 优化子查询:将相关子查询优化为连接查询或临时表查询,以减少执行次数和提高性能。 10. 慎用触发器:触发器可以在满足一定条件时自动执行某些SQL语句,但过于复杂的触发器可能会导致性能问题,应当合理设计...

    SQL进阶教程 配套示例SQL语句

    2. **子查询(Subquery)**:子查询是在一个查询语句内部嵌套的另一个查询,用于返回单个值、行集或表,作为外部查询的一部分使用。它可以用于过滤、比较、计算等操作,是处理复杂逻辑的重要工具。 3. **窗口函数...

    oracle语句优化方案

    在含有子查询的SQL语句中,优化的关键在于减少对表的重复查询。通过适当的索引和查询重写,可以避免子查询中的冗余表扫描,显著提升查询效率。 #### 利用Oracle内置函数 掌握并恰当运用Oracle提供的内置函数,如...

    sql语句金典教程-----sql21天自学通

    2. **查询操作**:深入讲解SELECT语句的高级用法,如聚合函数(COUNT、SUM、AVG、MAX、MIN)、分组(GROUP BY)与排序(ORDER BY)、子查询以及连接查询(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)。...

    SQL语句教程大全

    - **子查询**:嵌套在其他SQL语句中的查询,用于获取满足特定条件的结果集。 - **集合操作**:UNION, UNION ALL, INTERSECT, EXCEPT用于合并或对比不同查询的结果。 3. **更新与删除** - **更新数据**:`UPDATE`...

    非常好用的SQL语句优化34条

    - **知识点**: 在进行子查询时,EXISTS和NOT EXISTS通常比IN和NOT IN更高效,因为它们只需要找到第一个符合条件的记录就可以停止执行。此外,NOT IN在处理NULL值时可能会出现意料之外的结果,因此推荐使用NOT EXISTS...

    30个Oracle语句优化规则详解

    尽可能将子查询转换为连接操作,这可能更高效。 12. 使用索引合并 Oracle的索引合并策略允许同时使用多个索引来提高查询性能。 13. 限制返回的数据量 使用LIMIT或ROWNUM限制查询返回的行数,减少网络传输和客户端...

    SQL语句的优化学习总结

    在包含子查询的SQL语句中,特别注意减少对目标表的查询次数至关重要。通过优化子查询的设计,避免冗余数据的加载,可以显著提升查询速度。例如,通过预先计算或缓存部分结果,可以减少对同一表的多次访问。 #### ...

Global site tag (gtag.js) - Google Analytics