`

ORACLE锁机制研究

阅读更多
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。



Oracle数据库的锁类型

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数据库的内部结构。

DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。

悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.

原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.

二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。


阻塞

定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE


INSERT

Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

Select …for update

当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.



死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表


表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象
只能查询这些数据行 Select for update、Lock for

update、Lock row share

3 SX(Row-X) 行级排它锁,
在提交前不允许做DML操作 Insert、Update、
Delete、Lock row share

4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
分享到:
评论

相关推荐

    有关Oracle封锁机制的研究

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

    关于Oracle数据库中的锁机制深入研究

    Oracle数据库的锁机制是保证多用户并发访问数据库时数据一致性和完整性的关键工具。数据库作为一个共享资源,如果没有有效的并发控制,可能导致数据不一致,影响事务的正常执行。本文深入探讨了Oracle数据库的锁机制...

    Oracle多粒度封锁机制研究

    本文主要探讨了Oracle数据库中的行级锁(TX锁)和表级锁(TM锁),以及相关的意向锁机制。 首先,封锁机制的核心在于防止并发操作导致的数据不一致。在Oracle中,最基本的锁类型是排它锁(X锁)和共享锁(S锁)。X...

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

    ### Oracle多粒度封锁机制研究 #### 数据库锁的基本概念 在并发环境下,为了确保不同用户访问同一数据库对象时能够保持数据的正确性——避免数据丢失、实现可重复读以及防止读取未提交数据(脏读),数据库系统...

    Oracle多粒度封锁机制研究(锁)借鉴.pdf

    Oracle的多粒度封锁机制主要体现在行级锁(TX锁)和表级锁(TM锁)上。TX锁,也称为事务锁,是在事务执行插入、更新、删除操作或使用`SELECT ... FOR UPDATE`时获取的,它覆盖事务中所有锁定的数据行,直到事务提交...

    Oracle数据库锁的研究.pdf

    综上所述,理解Oracle数据库的锁机制对于数据库管理员和开发人员来说至关重要,因为它直接影响到系统的并发性能和数据一致性。掌握如何正确使用和管理锁,可以有效地避免并发问题,保证数据库系统的稳定运行。

    oracle 锁

    Oracle数据库是世界上最广泛使用的数据库系统之一,其在处理并发事务和数据安全性方面有着出色的表现。...通过深入研究Oracle锁的原理和实践,我们可以更好地优化数据库操作,避免潜在的问题,并提升系统的整体效率。

    李兴华Oracle全部笔记

    此外,可能还会涵盖数据库事务处理、并发控制和锁机制,这些都是保证数据一致性、完整性和并发性能的关键部分。 再者,李兴华的笔记可能涉及Oracle的性能优化,这包括SQL查询优化、索引优化、数据库参数调优等,...

    ORACLE数据库系统加锁问题的研究 (1).pdf

    总的来说,Oracle数据库通过精细的锁机制实现了对数据的高效并发控制,确保了数据的一致性和完整性。设计和优化数据库应用时,理解并合理使用这些锁机制对于提高系统性能和避免潜在的数据冲突至关重要。同时,开发者...

    oracle 本科教学ppt

    通过这份“Oracle本科教学PPT”,学生将获得对Oracle数据库全面而深入的理解,为进一步的数据库管理、开发或相关研究打下坚实基础。学习过程中,理论结合实践,通过实际操作加深对知识的理解,将更有利于掌握Oracle...

    oracle课件

    了解事务的ACID特性(原子性、一致性、隔离性和持久性),以及乐观锁、悲观锁和多版本并发控制(MVCC)机制,对理解并发控制至关重要。 八、备份与恢复 Oracle提供多种备份和恢复策略,如物理备份、逻辑备份、RMAN...

    oracle性能优化大全

    三、Oracle锁机制 Oracle的锁机制用于保证数据的一致性和完整性,防止并发操作带来的数据冲突。主要的锁类型包括: 1. **行级锁**:如ROWLOCK,用于锁定单个数据行,允许并发访问不同行。 2. **表级锁**:如TABLE...

    ORACLE数据库系统加锁问题的研究.pdf

    Oracle数据库系统在处理数据时,为了确保数据的完整性和一致性,采用了加锁机制。...通过正确使用Oracle提供的锁机制,可以有效控制并发访问,确保数据的完整性和一致性,从而避免数据处理中的异常情况。

    深入浅出Oracle之DB、PLSQL专题研究

    ### 深入浅出Oracle之DB、PLSQL专题研究 #### 一、特殊值、特殊字段、特殊对象、特殊语句 ...接下来的部分将涉及更多的Oracle数据库技术细节,包括连接处理、事务管理、锁机制等内容,这些知识点同样重要且实用。

    高级owi与oracle性能调优

    - **处理死锁和锁争用**:分析v$lock视图,诊断和解决锁相关的问题。 - **分析和优化表空间的使用情况**:例如,使用表空间映射和自动段空间管理。 ### Oracle性能调优实践案例 在实践中,调优工作往往需要结合...

    Oracle编程艺术-深入数据库体系结构

    此外,Oracle的并发控制机制,如行级锁、多版本并发控制(MVCC),也是书中重要的内容。 5. 存储结构与物理组织:深入研究Oracle的数据块、索引块、重做日志文件等存储结构,以及块内部的记录格式,有助于理解数据...

    Expert.Oracle.Database.Architecture.3rd.Edition

    理解锁机制和回滚段对于解决并发问题非常重要。 6. **查询优化**:Oracle的查询优化器根据统计信息选择最优执行计划。理解成本基优化器的工作原理和如何调整统计信息,可以显著提升SQL查询性能。 7. **备份与恢复*...

    ORACLE核心应用技术研究.doc

    Oracle核心应用技术研究 Oracle ERP最佳技术实践E-BUSINESS SUITE是Oracle为企业提供的一整套集成的财务、供应链和人力资源管理解决方案。本文档将深入探讨Oracle的核心应用技术,包括数据库(DB)、PL/SQL编程语言...

Global site tag (gtag.js) - Google Analytics