Oracle - 锁

锁概念

锁出现在数据共享的环境中,它是一种机制,在访问相同资源时,可以防止事务之间的破坏性交互。例如,在多个会话同时操作某表时,优先操作的会话需要对其锁定。

事务的分离性要求当前事务不能影响其他的事务,所以当多个会话访问相同的资源时,数据库系统会利用锁确保它们像队列一样依次进行。Oracle处理数据时用到的锁是自动获取的,我们不用对此有过多的关注,但Oracle允许我们手动锁定数据。

Oracle利用很低的约束提供了最大程度的并发性,例如某会话正在修改一条记录,那么仅仅该记录会被锁定。而其他会话可以随时做读取操作,但读取的依然是修改前的数据。

Oracle的锁保证了数据的完整性。例如,当一个会话对表A的某行记录进行修改时,另一个会话也来修改该行记录,在没有任何处理的情况下保留的数据会有随机性,而这种数据是没有任何意义的,为脏数据。如果此时使用了行级锁,第一个会话修改记录时封锁该行,那么第二个会话此时只能等待,这样就避免了脏数据的产生。

锁的分类

Oracle中分为两种模式的锁,一种是排他锁(X锁),另一种是共享锁(S锁)。
排他锁也可以叫写锁。这种模式的锁防止资源的共享,用做数据的修改。假如有事务T给数据A加上该锁,那么其他的事务将不能对A加任何的锁,所以此时只允许T对该数据进行读取和修改,直到事务完成将该类型的锁释放为止。
共享锁也可以叫读锁。该模式锁下的数据只能被读取,不能被修改。如果有事务T给数据A加上共享锁后,那么其他事务不能对其加排他锁,只能加共享锁。加了该锁的数据可以被并发地读取。
锁是实现并发的主要手段,在数据库中应用频繁,但很多都由数据库自动管理,当事务提交后会自动释放锁。

锁的类型

Oracle为了使数据库实现高度的并发访问,它使用了不同类型的锁来管理并发会话对数据对象的操作。Oracle的锁按作用对象不同分为如下几种类型。

DML锁:该类型的锁被称为数据锁,用于保护数据。
DDL锁:可以保护模式中对象的结构。
内部闩锁:保护数据库的内部结构,完全自动调用。

DML

其中,DML锁主要保证了并发访问时数据的完整性。如果再细分,它又可以分为如下两种类型的锁:
1)行级锁(TX),也可以称为事务锁。当修改表中某行记录时,需要对将要修改的记录加行级锁,防止两个事务同时修改相同记录,事务结束,该锁也会释放,是粒度最细的锁。该锁只能属于排他锁(X锁)。
2)表级锁(TM),主要作用是防止在修改表的数据时,表的结构发生变化。例如,会话S在修改表A的数据时它会得到表A的TM锁,而此时将不允许其他会话对该表进行变更或删除操作。

在执行DML操作的时候,数据库会先申请数据对象上的共享锁,防止其他的会话对该对象执行DDL操作。一旦申请成功,则会对将要修改的记录申请排他锁,如果此时其他会话正在修改该记录,那么等待其事务结束后再为修改的记录加上排他锁。

表级锁包含如下几种模式:
ROW SHARE,行级共享锁(RS)。该模式下不允许其他的并行会话对同一张表使用排他锁,但允许其利用DML语句或lock命令锁定同一张表中的其他记录。SELECT … FROM FOR UPDATE语句就是给记录加上了RS锁。
ROW EXCLUSIVE,行级排他锁(RX)。该模式下允许并行会话对同一张表的其他数据进行修改,但不允许并行会话对同一张表使用排他锁。
SHARE,共享锁(S)。该模式下,不允许会话更新表,但允许对表添加RS锁。
SHARE ROW EXCLUSIVE,共享行级排他锁(SRX)。该模式下,不能对同一张表进行DML操作,也不能添加S锁。
EXCLUSIVE,排他锁(X)。该模式下,其他的并行会话不能对表进行DML和DDL操作,该表只能读。

DDL

DDL锁也可以称为数据字典锁,主要作用是保护模式中对象的结构。当执行DDL操作时,首先Oracle会自动地隐式提交一次事务,然后自动地给处理对象加上锁;当DDL结束时,Oracle会隐式地提交事务并释放DDL锁。与DML不同的是,用户不能显式地要求使用DDL锁。DDL锁分为如下3类:
Exclusive DDL Lock,排他DDL锁定。如果对象加上了该类型的锁,那么对象不能被其他会话修改,而且该对象也不能再增加其他类型的DDL锁。如果是表,此时可以读取数据。
Shared DDL Lock,共享DDL锁定。保护对象的结构,其他会话不能修改该对象的结构,但是允许修改数据。
Breakable Parsed Lock,能打破的解析锁定。该类型的锁可以被打断,不能禁止DDL操作。

Oracle - 锁_第1张图片

系统管理Lesson 10. Managing Data Concurrency

V$LOCK
Oracle - 锁_第2张图片

select distinct lmode from v$lock order by 1;

居然没有lmode=5的。。。
Oracle - 锁_第3张图片

你可能感兴趣的:(DBA,oracle,数据库)