`

oracle table-lock的5种模式

阅读更多
Oracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。
DML lock又可以分为row lock和table lock。row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table <table_name> in </table_name> name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如 果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。(S)

还有两种锁定模式,row share(RS)和row exclusive(RX)。他们允许的并发操作更多,一般直接用DML语句自动获得,而不用lock语句。

详细参考concepts文档中的"Type Of Locks":http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937
分享到:
评论
2 楼 xiaoxiao1984 2008-06-20  
select for update 应该是row share mode的锁, 也就是行级的share锁, 而share row exclusive mode 应该是禁止其他session以share mode来锁表的, 所以share row exclusive mode的锁会阻塞select for update的锁
1 楼 xiaoxiao1984 2008-06-20  
如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。(SRX)

如果能够select for update, 也就意味着可以更新阿, 在10g上的尝试结果如下:
session 1:
SQL> rollback;

回退已完成。

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> lock table hr.jobs in share row exclusive mode nowait;

表已锁定。

SQL> show user
USER 为 "SYS"
SQL>

session 2:
SQL> rollback;

回退已完成。

SQL> show user;
USER 为 "HR"
SQL> select * from hr.jobs where job_id like 'ST%' for update nowait;
select * from hr.jobs where job_id like 'ST%' for update nowait
                 *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

使用share row exclusive mode锁定的时候,其他session 应该不能进行insert/update/delete/drop 等操作, 同样也不能进行select for update

相关推荐

    oracle-lock

    - 在Oracle中,`LOCK TABLE`用于在会话级别锁定表,阻止其他会话对指定表的DML操作。这在处理高并发时特别有用,确保在执行敏感操作(如批量更新或删除)时数据的一致性。 - 使用`UNLOCK TABLE`语句可以解除对表的...

    lock_table.rar_Table_lock table_oracle lock table

    在Oracle数据库系统中,"lock table" 是一个重要的管理功能,用于控制多个用户对特定表的并发访问。当一个用户对表执行修改操作(如INSERT、UPDATE或DELETE)时,Oracle会自动对表施加锁,以防止其他用户在同一时间...

    oracle lock

    ### Oracle Lock 概念与类型详解 #### 一、引言 在数据库管理系统(DBMS)中,锁是一种机制,用于管理多个用户同时访问共享资源(如数据库中的表或行)时可能产生的冲突。Oracle数据库中提供了多种类型的锁来确保数据...

    Oracle入门--Oracle游标使用

    4. **DML语句**:INSERT、UPDATE、DELETE和LOCK TABLE是PL/SQL中的数据操纵语言。在PL/SQL块中,可以直接使用这些语句,并结合变量来处理数据。例如,以下过程使用游标处理员工解雇: ```sql CREATE OR REPLACE ...

    Oracle----相关常用命令

    根据提供的文件信息,本文将详细解释Oracle数据库中的常用命令及相关知识点。这些命令涵盖了数据库操作的基础层面,对于初学者和日常使用者来说非常实用。 ### 1. 设置显示参数 - **`set linesize 100;`**:设置每...

    彻底搞清楚library cache lock的成因和解决方法

    在 Oracle 数据库中,“Library Cache Lock”是一种常见的等待事件,通常出现在以下两种情况: 1. **当会话尝试执行 DDL 操作时:** - 当会话1(session 1)正在对某个表执行 DML 或者 DDL 操作时,同时存在另一个...

    oracle Session与lock 解除

    Oracle中的锁主要有以下几种模式: - **0:None** —— 没有任何锁。 - **1:Null** —— 空锁,表示没有任何锁的状态。 - **2:Row-S (RS)** —— 行共享锁,允许其他用户读取锁定的数据行,但不能进行写操作。 - ...

    对oracle锁几种模式的理解

    ### 对Oracle锁几种模式的理解 #### 一、Oracle锁模式概述 在Oracle数据库中,为了保证数据的一致性和完整性,引入了多种类型的锁机制。这些锁机制能够有效地控制并发操作,防止不同用户或进程间的相互干扰。...

    在分布式事务中实现基于Oracle PLSQL UL LOCK的悲观离线锁

    本文将深入探讨如何在分布式事务中实现基于Oracle PL/SQL的UL (User-Level) LOCK的悲观离线锁策略。这种策略主要用于防止多个并发操作对同一数据进行修改,从而避免数据不一致性和死锁等问题。 首先,理解悲观锁的...

    Oracle Pro*C 程序开发

    - **重置默认锁状态**:使用FOR UPDATE OF和LOCK TABLE语句来控制锁定行为。 - **FETCH中应用COMMIT语句**:在FETCH操作中使用COMMIT来保证数据的一致性。 - **分布式事务处理**:在多个数据库之间协调事务的完成或...

    Oracle数据库学习日记-实用性最强的Oracle学习总结.docx

    ### Oracle数据库学习知识点详解 #### 一、基本使用 ##### 1.1 常用命令 **1.1.1 Connect/Disconnect数据库连接命令** - **用途:** 连接或断开与Oracle数据库的连接。 - **语法示例:** - `sqlplus username/...

    oracle-SQL笔记

    Oracle SQL是用于管理和操作Oracle数据库的关键工具,涵盖了数据查询、数据操纵、数据定义以及数据控制等多个方面。在本文中,我们将深入探讨Oracle SQL中的数据控制语句(DCL)、数据定义语句(DDL)以及一些基本的...

    Oracle运维最佳实践-下.pdf 带书签

    - 动态采样是Oracle的一种技术,用于收集额外的统计信息来改善执行计划的选择。 - 本书解释了如何识别使用了动态采样的SQL语句,并提供了解决方案。 - 实例: - 使用`DBMS_XPLAN.DISPLAY_CURSOR`显示执行计划,...

    oracle 锁

    在Oracle中,主要有两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。行级锁允许并发用户同时访问不同的数据行,提高了系统的并行性;而表级锁则在整个表上施加锁定,适用于需要全局锁定的...

    日积月累-oracle笔记

    - **V$LOCK视图**:提供了关于锁定对象的信息,包括锁定模式、请求者等。通过结合V$LOCK和V$TRANSACTION视图,可以深入分析锁冲突和死锁的原因。 ### 数据加载与并行处理 在Oracle数据库中,数据的高效加载对于大...

    ORACLE数据库教程-SQL使用讲解.ppt

    - `LOCK TABLE`:用于锁定表。 - `SET CONSTRAINTS`:用于设置约束的状态。 - `SET TRANSACTION`:用于设置事务的工作方式。 5. **审计控制语言**:用于控制和审计用户的活动。 - `AUDIT`:用于开启审计功能。 ...

    oracle死锁表后处理

    oracle锁机制可以分为六种模式:none、null、Row-S、Row-X、Share、exclusive。其中,Row-S模式为共享表锁,sub share,Row-X模式为行独占锁,sub exclusive,Share模式为共享锁,阻止其他DML操作,S/Row-X模式为...

    Oracle五种表级排他锁的总结和归纳

    5. 共享行排他锁(Share Row Exclusive Table Lock,SRX) 共享行排他锁是一种介于行级共享锁和行级排他锁之间的锁,它允许其他事务添加行级共享锁,但不允许添加行级排他锁。拥有 SRX 锁的事务可以执行更新操作,但...

    MySQL掌握备份恢复工具mysqldump实践

    - 此选项是一个快捷组合,相当于同时设置了`--add-drop-table --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset`。该选项使`mysqldump`能够快速导出数据,并...

Global site tag (gtag.js) - Google Analytics