`

oracle的锁机制

阅读更多

锁是一种机制,是用来管理对一个共享资源的并行访问。
解停? 只有对资源进行并行访问时才会用到锁,但单个户模式下的数据库是不需要锁的。所以锁的目的就是在多个用户并行访问数据库时为了保证数据的一致和准确性采用的一种保护机制。几乎所有的数据库都采用了锁的机制,但其实现机制却有很大的却别。Oracle在锁的处理上较SYBASE和informix有着明显的优势,特别是在行级锁的处理上,基本上算是完美。

封锁问题:
一个典型的程序设计缺陷例子。
A:用户1检索到一行数据,并准备修改。
B:用户2检索到相同的数据。
C:用户2删除了这一行,并提交。
D:用户修改那一行,并提交,结果程序报错,该行不存在。
用户抱怨开发商,开发商认为是用户人为因素造成。

分析:
当用户1通过程序从数据库中提取出自己想要修改的记录时,该记录并没有锁定,此时用户2用同样的条件检索到该行,并删除,提交导致该行不复存在,此时用户1对检索到的行修改后提交时,由于该行已经被删除,导致用户操作失败。从而对软件失去信心。
解决方法:
在对该行进行修改之前,对该行锁定,防止其他人对该行进行dml操作。select * from tab for update nowait;
此时数据库将在该行上建立一个行级排它锁,直到等到一个commit或者rollback时才释放。

一、悲观封锁
锁在用户修改之前就发挥作用:
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 lock
DDL lock

DML LOCK
DML锁是用来保护数据在被并行访问时数据的安全和一致性,按照限制级别的高低依次可以分成以下几种:
1:ROWLOCK(TX)
DML:insert,update,delete ,select …for update.
这些操作会在所操作的行上建立排它锁,直到所在的事物提交或会滚才释放。

2:table-lock(TM )
当一个事物在进行DML操作时,所在的事务会对所操作的表加表级锁,以保证在这个事务过程中表不被改变。
表级锁按照限制等级可以分成以下几类:
3:RS
Row share table lock
以下的操作会产生RS lock
Select * from tab for update.
LOCK TABLE table IN ROW SHARE MODE;
RS不允许的操作
LOCK TABLE table IN EXCLUSIVE MODE;

4:RX
Row Exclusive Table Locks
以下的操作会产生RS lock
1:INSERT,UPDATE ,DELETE
2:LOCK TABLE table IN ROW EXCLUSIVE MODE;
RX不允许的操作
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;

5:S
Share Table Locks
以下操作产生S lock.
LOCK TABLE table IN SHARE MODE;
S不允许的操作
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
LOCK TABLE table IN ROW EXCLUSIVE MODE;

SRX
Share Row Exclusive Table Locks
以下操作产生SRX LOCK
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
SRX不允许的操作.
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
X
Exclusive Table Locks
一下操作产生X LOCK
LOCK TABLE table IN EXCLUSIVE MODE;
X不允许的操作
不允许所有的操作

分享到:
评论

相关推荐

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    Oracle 锁机制问题详解

    ### Oracle 锁机制问题详解 #### 一、引言 在多用户数据库环境中,当多个用户尝试同时访问或修改同一份数据时,就需要通过锁机制来确保数据的一致性和完整性。Oracle 数据库提供了多种类型的锁来支持事务隔离级别,...

    oracle锁机制

    关于oracle锁以及并发的详细描述。

    oracle锁机制研究

    oracle锁机制研究

    oracle锁机制_bzm整理1

    以下是对Oracle锁机制的详细解释: 1. **锁的存在原因**: - 并发控制:在多用户环境下,多个事务可能同时访问相同的数据,锁用于防止冲突,确保每个事务看到的是一个一致的数据视图。 - 数据一致性:通过锁,...

    Oracle的锁机制

    Oracle的锁机制是数据库管理系统中一个关键的组成部分,它的主要目标是确保在多用户环境下,数据的读一致性、完整性和并行性。Oracle提供了多种类型的锁来满足这些需求。 首先,按照是否独占,锁分为排它锁(X锁)...

    Oracle锁机制

    Oracle数据库多粒度锁机制介绍概述.内容简单易懂,容易掌握

    oracle数据库中的锁机制

    #### Oracle锁的类型与模式 1. **行级锁**:当一个事务尝试修改某一行时,Oracle会自动对该行加锁,阻止其他事务同时修改同一行。这种锁称为行级锁,是最细粒度的锁。 2. **表级锁**:在某些情况下,整个表可能被...

    ORACLE锁机制深入理解

    Oracle数据库的锁机制是确保多用户并发访问时数据一致性的重要工具。在数据库环境中,当多个事务同时尝试访问和修改同一数据对象时,如果没有适当的控制,可能会导致数据的不一致性和并发问题。为了解决这些问题,...

    oracle锁机制了解和学习电网项目学习

    oracle数据库锁机制常备大家所诟病,希望对学习者有帮助,大家自觉学习

    oracle锁的概念

    通过以上介绍可以看出,Oracle锁机制是非常复杂且功能强大的。正确理解和运用锁机制对于提高数据库系统的性能和稳定性至关重要。在实际应用中,开发者需要根据具体的业务需求选择合适的锁类型和策略,以确保数据的...

    oracle锁表查询oracle锁表查询oracle锁表查询

    #### 一、Oracle锁机制简介 在Oracle数据库中,锁是一种重要的并发控制机制,用于管理多个用户对同一数据资源的访问。通过锁机制,Oracle能够确保数据的一致性和完整性,避免多用户操作时可能出现的数据冲突问题。 ...

    Oracle锁 图例

    总结,Oracle锁机制是数据库并发控制的核心,理解并熟练掌握锁的使用和管理对于优化数据库性能、避免并发问题至关重要。通过使用适当的工具和技巧,我们可以有效地监控和解决锁相关问题,从而提高系统的稳定性和响应...

    ORACLE锁深入分析

    总之,Oracle锁机制是其并发控制的核心,通过精细的锁类型和模式,Oracle能够在保证数据一致性的同时,支持多个并发事务高效地访问数据库资源。了解并掌握Oracle锁的原理和应用,对于优化数据库性能和解决并发问题至...

    oracle多粒度封锁机制研究

    在数据库管理系统中,锁机制是用来保证数据的一致性与完整性的关键技术。作为业界广泛应用的数据库产品,Oracle的锁机制在...对于想要深入了解Oracle锁机制的读者而言,本文提供的信息足以作为进一步研究和实践的基础。

    oracle并发和锁机制

    oracle并发和锁机制,oracle并发锁,oracle锁

    oracle锁讲解笔记

    ### Oracle锁机制详解 #### 锁的基本概念与作用 锁机制是Oracle数据库中用于管理并发访问共享资源的关键组件。在多用户环境中,确保数据的一致性和完整性至关重要,尤其是在多个会话试图同时修改相同数据的情况下...

    ORACLE关于锁和V$LOCK的分析.docx

    ORACLE 锁机制和 V$LOCK 视图分析 Oracle 数据库为了实现并发操作,使用了锁机制来控制对数据的访问。锁机制是 Oracle 数据库并发控制的核心机制之一。锁机制能够有效地防止多个用户同时访问同一个数据项,避免了...

Global site tag (gtag.js) - Google Analytics