Oracle 锁工作原理

三种现象:
  • 胀读取:一个事物读取了被其他事物写入但未提交的数据
  • 不可重复读取:一个事物再次读取曾经读取过,发现数据已经被其他已经提交的事物修改或者删除
  • 不存在读取:事物按照之前查询条件重新查询,返回的结果集中包含其他已提交事务插入满足条件的新数据
SQL92标准的隔离级别
  • 未提交读取
  • 已提交读取
  • 不可重复读取
  • 串行化


现象脏读取不可重复读取不存在读取
隔离级别

未提交读取(read uncommitted)允许允许允许
已提交读取(read committed)不允许允许允许
可重复读取(repeatable read)不允许不允许允许
串行化(rerializable)不允许不允许不允许
Oracle支持事务隔离级别
已提交读取:
串行化:串行化隔离的事务只能看到事务执行前就已经提交数据,以及事务内Insert、Update、及delete语句对数据的修改。串行化隔离的事务不会出现不可重复读取或不存在的读取的现象
只读模式:只读事务只能看到事务执行前就已经提交的数据,且事务中不能执行Insert、Update及Delete语句

set transaction isolation level read commited
set transaction isolation level serializable
set transaction read only
脏数据就是读到database buffer cache做了修改但还没有写到datafile里面的数据,只要没有写入数据文件,不管是否提交,都可以称为脏数据。

锁:是防止访问相同资源的事务产生破坏性交互的机制

锁模式:
排他锁:能够阻止共享被加锁的资源。对数据进行修改时必须获得此种模式的锁。第一个排他地对资源加锁的事务是唯一可以对此资源进行修改的事务,直至排他锁被释放
共享锁:依据操作类型有条件地允许共享被加锁的资源。对数据进行读取的多个用户可共享此数据,这些用户可以对资源加以共享锁,防止其他用户并发地修改此资源。多个事务可以对相同的资源加共享锁



描述

DML 锁(数据锁)
 
DML 的作用是保护数据。例如,表级锁(table lock)对整个表加锁,行级锁(row lock)则对选定的数据行加锁。
 
DDL 锁(数据字典锁)
 
DDL 锁的作用是保护方案对象的结构。例如,表及视图的定义。
 
内部锁(internal lock)及闩锁(latch)
 
内部锁及闩锁用于保护数据库的内部结构,例如,数据文件。内部锁及闩锁的管理完全由 Oracle 自动完成。
 

行共享表级锁(row share table lock RS):表明拥有此锁的事务已锁定了表内的某些数据行,并有意对数据进行更新操作
SELECT....FROM table ....FOR UPDATE OF ......
LOCK TABLE table IN ROW SHARE MODE
允许操作:某个事务拥有了某个表的行共享表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁的操作。也就是说,其他事务同时也能获得相同表上的行共享锁,行排他共享,及共享行排他模式的表级锁。
禁止操作:某个事务拥有了某个表的行共享表级锁后,只会禁止其他事务通过以下语句排他对相同表进行写操作。LOCK TABLE table IN EXCLUSIVE MODE;

行排他表级锁(row exclusive table lock RX):通常表面拥有此锁 的事务已经对表内的某些数据进行了更新操作。
INSERT INTO table.....
UPDATE table.....
DELETE FROM table.....
LOCK TABLE table IN ROW EXCLUSIVE MODE;
允许操作:某个事务拥有了某个表的行排他表级锁后,其他事务依然可以并发地对相同数据表执行查询,插入,更新,删除操作,或对表内数据行加锁操作。即行排他表级锁允许其他多个事务同时获得相同表上的行共享表级锁或行排他表级锁
禁止操作:某个事务拥有了某个表的行排他表级锁后,将禁止其他事务手工地对表加锁进行排他地读写操作,因此其他语句不能对相同表加锁
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHAE EXCLUSIVE MODE
LOCK TABLE table IN EXCLUSIVE MODE;

共享锁(share table lock S):LOCK TABE table IN SHAE MODE
允许操作:某个事务拥有了某个表的共享表级锁后,其他事务可以查询表,可以使用select ......for update 语句锁定选中的数据行,也能够成功执行LOCK TABLE .......IN SHARE MODE 语句。但其他事务不能对表进行更新操作。多个事务可以并发地获得同一个表上的共享表级锁,在此种情况下任何事务都不能对表进行更新。因此,拥有共享表级锁的事务只能在此表上没有其他事务的共享表级锁时,才能对表进行更新操作
禁止操作:某个事务拥有了某个表的共享级锁后,将禁止其他事务修改此表,同时禁止其他事务执行以下语句
LOCK TABLE table IN ROW EXCLUSIVE MODE
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;

共享行排他表级锁(share row exclusive table lock SRX):LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
允许操作:同一时间只有一个事务 能够获得表的共享行排他表级锁,某个事务拥有了某个表的共享行排他表级锁后,其他事务可以查询表,可以使用select ....for update 语句锁定选中的数据行,当不能对表进行更新操作
禁止操作:拥有共享行排他表级锁的事务将阻止其他事务获取行排他表级锁来修改数据,共享行排他表级锁还能阻止其他事务在相同表上获取共享表锁,共享行排他表级锁及排他表级锁
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;

排他表级锁(exclusive table lock X):LOCK TABLE table IN EXCLUSIVE MODE;
允许操作:同一时间只有一个事务能获得表上的排他表级锁。一个事务获得表级锁后,其他事务只能对表进行查询操作
禁止操作:一个事务获得排他表级锁后,将禁止其他事务对表执行任何DML操作,其他事务无法获取表上任何类型的锁












<think>嗯,用户问的是Oracle数据库机制原理,需要深入解析。首先,我得回顾一下自己知道的Oracle相关知识,确保回答准确。记得用户提到要结构清晰,分步骤解答,所以可能需要分几个部分来讲解。 首先,的基本概念和作用。数据库中主要是为了并发控制,保证数据的一致性和隔离性。Oracle分为共享和排他,可能还有其他类型,比如行级、表级之类的。需要区分这些类型,并说明它们的使用场景。 然后,的粒度,也就是定的对象范围。Oracle支持行级、块级、表级等。行级的并发性最好,但管理开销大;表级则相反。这部分要详细解释,可能还要结合例子说明不同粒度的应用情况。 接下来是的模式,比如共享(S)和排他(X)。还有可能存在的其他模式,比如行共享(RS)、行排他(RX)、共享行排他(SRX)等。需要解释每种模式的含义和适用场景,比如查询用共享,更新用排他的兼容性矩阵也很重要,说明不同之间是否冲突。例如,共享和共享兼容,但共享和排他不兼容。这部分可能需要画个表格,不过在文本里用文字描述清楚。 的自动管理机制是Oracle的特点之一,用户可能想知道DML操作如何自动加,DDL操作是否需要显式,以及死检测和处理机制。比如,当事务互相等待时,Oracle会自动检测并回滚其中一个事务。需要引用用户提供的引用[2]里的死例子,说明Oracle如何处理死的监控和优化部分,用户可能想知道如何查看信息,诊断冲突,以及优化策略。比如使用V$LOCK视图,DBA_BLOCKERS等工具,以及优化事务设计,减少的持有时间,合理使用索引等。这里可以引用引用[1]提到的优化段的大小和分布来减少I/O操作,可能和优化有关联吗?或者可能需要分开讨论。 最后,的高级特性,比如NOWAIT选项、延迟转换、升级机制等。这部分可能稍微复杂,需要简明扼要地解释,避免让用户感到困惑。 用户提供的引用中,引用[2]提到了死的情况,引用[1]和[3]涉及性能优化和内部机制。可能需要将这些引用自然地融入到回答中,比如在死部分引用[2],在优化时引用[1]中的性能调优相关内容。 还要注意用户要求生成相关问题,所以需要准备几个相关问题,比如的类型区别、如何监控、死处理、和性能的关系等。 在结构上,可能需要分几个大点,每个大点下有子点,使用标题和编号,保持层次清晰。同时,代码块可能不需要,但如果有示例SQL语句或命令,可以用代码格式展示,比如查询V$LOCK的语句。 还要确保使用中文回答,数学公式用$...$,独立公式用$$...$$,但这个问题可能涉及较少的数学公式,不过如果有涉及,比如的兼容性矩阵,可能需要用表格或适当的方式呈现。 总结下来,回答的结构大致是: 1. 的基本作用 2. 的类型(粒度、模式) 3. 兼容性 4. 自动管理机制(包括死) 5. 监控与优化 6. 高级特性 然后相关问题部分。 需要检查是否有遗漏的重要点,比如意向的概念,或者Oracle特有的机制,比如TX和TM的区别。例如,TX是事务,TM是表级,可能需要在的类型部分详细说明。 另外,可能还需要提到的转换和升级,比如行级在某种情况下是否会升级为表级,以及Oracle是否支持升级,这可能影响并发性能。 在回答中,要确保术语准确,比如“行级”和“表级”的正确使用,避免混淆。同时,引用用户提供的引用内容,比如在死部分引用[^2],在性能优化部分引用[^1]。 现在把这些思路整理成一个结构清晰、分步骤的解释,确保覆盖用户的问题点,并符合格式要求。</think>### Oracle数据库机制深入解析 #### 一、的基本作用 Oracle实现**并发控制**的核心机制,用于协调多用户并发访问数据时的冲突,确保事务的**ACID特性**(原子性、一致性、隔离性、持久性)。通过定资源(如行、表),防止多个事务同时修改同一数据导致不一致。 --- #### 二、的类型与模式 1. **按粒度划分** - **行级(Row-Level Lock)** 定单行数据,并发性最高,常用于DML操作(如`UPDATE`、`DELETE`)。 *示例*:`UPDATE employees SET salary=10000 WHERE id=123;` - **表级(Table-Level Lock)** 定整个表,用于DDL操作(如`ALTER TABLE`)或显式定(`LOCK TABLE`)。 - **块级(Block-Level Lock)** 定数据块(物理存储单元),由Oracle自动管理以优化I/O性能[^3]。 2. **按模式划分** - **共享(S)** 允许其他事务读取定资源,但禁止修改(如`SELECT ... FOR UPDATE`)。 - **排他(X)** 禁止其他事务读写定资源(如`INSERT`、`UPDATE`)。 - **意向(Intent Lock)** 高层级(如表级)标记低层级(如行级)的存在,例如: - **意向共享(IS)**:表级,表示事务将在某些行加S。 - **意向排他(IX)**:表级,表示事务将在某些行加X。 --- #### 三、的兼容性矩阵 不同模式之间的兼容性如下表所示: | 当前模式 | S | X | IS | IX | |------------|------|------|------|------| | S | 兼容 | 冲突 | 兼容 | 冲突 | | X | 冲突 | 冲突 | 冲突 | 冲突 | | IS | 兼容 | 冲突 | 兼容 | 兼容 | | IX | 冲突 | 冲突 | 兼容 | 兼容 | *说明*:S与S兼容,但X与其他所有模式均冲突。 --- #### 四、的自动管理机制 1. **DML自动加** Oracle自动为DML操作加(如`INSERT`加行级X),无需手动干预。 2. **死检测与处理** 当两个事务互相等待对方释放时,Oracle会检测死并强制回滚其中一个事务[^2]。例如: - 事务A定行1,请求行2;事务B定行2,请求行1 → 触发死。 3. **转换与升级** - 行级可能升级为表级(如执行全表扫描的`UPDATE`),但Oracle默认优先使用细粒度以优化并发。 --- #### 五、的监控与优化 1. **诊断工具** - `V$LOCK`视图:查看当前会话持有的。 ```sql SELECT sid, type, lmode, request FROM v$lock; ``` - `DBA_BLOCKERS`:定位阻塞其他事务的持有者。 2. **优化策略** - **减少持有时间**:优化事务逻辑,避免长事务。 - **合理使用索引**:降低全表扫描导致的升级风险。 - **NOWAIT选项**:避免阻塞,例如`SELECT ... FOR UPDATE NOWAIT`。 --- #### 六、高级特性 1. **延迟转换** Oracle允许某些操作(如索引维护)延迟转换,减少冲突。 2. **自治事务** 通过自治事务分离范围,避免主事务扩散。 --- ### 相关问题 1. Oracle中行级和表级的应用场景有何区别? 2. 如何通过`V$LOCK`视图分析冲突? 3. 死产生的根本条件是什么?Oracle如何避免死? 4. 机制与数据库性能调优有何关联?[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值