学习
实践
活动
工具
TVP
写文章

oracle lock 分类

锁的分类

DML LOCKS

dml lock 又称为数据锁,是为了数据在多用户并发访问下的数据一致性。比如,DML 锁可以防止两个用户在在线商城同时抢购到最后一本书。DML 锁可以防止同时冲突的DML或者DDL操作的干扰。DML语句自动获取以下类型的锁:ROW LOCKS (TX),TABLE LOCKS(TM)

row lock

row lock 又称为TX锁,它用来锁住表的单独一行。一个事务需要为增,删,改,merge 甚至是select xx for update 语句申请row lock。row lock会一直持续到事务提交或者回滚才释放。 行锁采用队列机制(queue),以防止两个会话修改同一行。数据库会始终以独占模式锁定修改的行,使其他事务不能修改该行。直到持有该锁的会话提交或者回滚。行锁能提供最佳细粒度的锁定,因此可以提供最佳的并发和吞吐。

note:如果事务由于实例错误导致结束,那么块级别的恢复会让行恢复到事务开始之前。如果一个事务在一个行上获取了row lock,那么事务也同时会申请一个锁在行所在的表上。这个表锁以防止会覆盖当前改变的数据的冲突的DDL操作。

row lock的存储

不像某些数据库,在内存用列表存储锁来管理锁。Oracle 数据库把锁信息

存储到数据块里面。数据库使用队列机制管理row locks。如果一个事务要对一个没有被锁住的行进行加锁,那么事务会在该块上加一个锁。被事务修改的每一行都会在块头存储事务的ID信息。当事务结束时,事务ID会继续留在块头,如果其他事务想要修改该行,就会用这个事务ID去检查这个锁是否活跃,如果锁是活跃的,那么该会话会请求当锁被释放时被通知,以获得锁。如果锁不活跃,那么该事务获得锁。

table locks(TM)

table locks 也称为TM锁,当事务进行DML操作和select xx for update 或者是lock table 时会请求此锁。

DML操作会请求table locks以使事务能维护该表,以及防止其他会造成干扰的DDL操作的事务对表进行操作。

table locks 有以下几种模式

row share(RS)

这种锁,也称为subshare table lock(SS),表明持有该锁的事务锁住了一些行以用来更新,row share lock是table lock的最低级的模式。提供对表的最高级别的并发。

row exclusive table lock(RX)

这种锁,也称为subexclusive table lock(SX),一般表明事务已经更新了某些行,或者使用了select xx for update。一个 SX 锁,允许其他事务进行插入,更新,删除或者是锁住表的其他行。因此SX 锁允许多个事务在同一个表同时的持有SX锁和SS锁。

share table lock(S)

持有share table lock 的事务允许其他事务对表进行查询(select xx for update除外),但是只有持有share table lock的事务允许对表进行更新。因为很多事务可能会同时的持有share table lock,持有这个锁并不能确保只有一个事务能更新这个表。

share row exclusive table lock(SRX)

这种锁,也称为share-subexclusive table lock(SSX),比share table lock更为严格。一个时间只有一个事务能请求表的SSX锁,持有SSX锁的事务允许其他事务查询该表(select xx for update除外),但是不允许其他事务对表进行更新。

exclusice table lock(X)

这种锁最为严格,严禁其他事务对表进行任何类型的DML操作或者对表加任何类型的锁。

locks and foreign keys

oracle 数据库最大程度的控制父键与依赖的外键的并发。

上锁行为依赖于外键列是否存在索引,如果外键键值不存在索引,那么子表就会被频繁的锁住。会产生死锁,降低并发量。因此外键应该都是要建立索引的。唯一的一个意外情况是主外键唯一,或者主键从不更新或者删除。

locks and foreign keys

当一个会话在对父表进行更新,删除,merge。而在子表的外键列上又没有索引时,数据库会请求对子表的全表锁(应该是SRX锁)。insert 操作不会请求全表锁。只会请求一个锁,以保护子表的结构。同时,对子表的DML操作不会请求对父表的任何table lock。

locks and indexed foreign keys

当一个会话在对父表进行更新,删除,merge。而在外键列上存在索引的时候,数据库不会请求对子表的全表锁。根据官方文档的意思,就是有索引的时候,会锁索引。官方文档没明说。

当修改主键的时候。在父表上的table lock预防有其他事务请求X级别的table lock,但是不能阻止其他会话对子表和父表进行DML。

note:约束指定了on delete cascade,在主表上删除也会导致子表的数据删除。删除子表上的数据,也会导致父表的删除。

DDL 锁

data dictionary(DDL) lock 用来保护用户对象的定义,当执行DDL操作时,会锁在相对应的对象上。只有当独立的用户对象在进行DDL操作期间被修改或者引用时才会被锁住。数据库永远不会锁住整个数据字典。(感觉oracle 说这句话的时候好傲娇)

数据库会在事务进行DDL操作的时候,自动申请DDL锁。比如当你创建并保存一个存储过程的时候,数据库会自动的为其中涉及到的对象申请DDL锁。DDL锁保护这些对象不被alter,drop在存储过程编译完成之前。

exclusive ddl lock

exclusive ddl lock 阻止其他会话持有DDL或者DML锁。大部分的DDL操作,除share DDL locks 以外,都会申请exclusive ddl lock来保护资源以防止其他会话可能执行修改,引用在同一对象上造成破坏性干扰。比如不允许在alter table add 的时候执行drop table。exclusive ddl lock在DDL语句执行期间一直持有,当语句执行完会自动commit,如果这个对象上的DDL lock 被其他操作持有,那么等到之前的DDL lock被释放后就会获得,然后执行。

share ddl locks

share ddl locks 阻止会造成破坏性冲突的DDL操作,但是允许类似的操作同时进行。比如,当你在编译一个存储过程的时候,对于里面包含的表,其他编译存储过程的操作也可以同时进行。但是其他事务可以申请exclusive DDL lock。share ddl lock 在DDL语句执行期间会一直持有,当语句执行完自动commit。因此, 持有share ddl locks的事务保证了定义的引用对象在事务期间保持不变。

break parse locks

SQL语句或者PL/SQL 单元对每一个用户对象的引用会持有解析锁,申请解析锁是为了当引用的对象被alter 或者drop 的时候,关联的share SQL area会失效。解析锁又称为break parse locks,因为他没有禁止任何DDL操作,还可以被任何DDL操作去除。在SQL解析阶段会在共享池中申请parse lock,只要该语句还存在share sql area中,那么这个锁就会一直被持有。

System Locks

oracle 数据库使用多种类型的system lock 保护数据库内部和内存结构,用户无法访问这些机制,因为用户无法控制他们的发生或者持续时间。

Latches

latch 是一种简单,低级的序列化机制,用来协调多个用户访问共享的数据结构 ,对象和文件。

latch 在多用户访问时,保护共享内存资源免受损坏。latch 在以下情况保护数据结构:

• 被多个会话并发修改时

• 被一个会话修改时,被另外一个会话读取

• 在被访问时,被回收(aging out)

通常来说,一个latch 保护多个在SGA中的对象,比如,类似于DBW和LGWR这样的后台进程从shared pool中分配内存以创建数据结构。为了分配这部分内存,这些进程会使用share pool latch来有序的访问以避免两个进程同时尝试去检查或者修改share pool。当获得内存后,其他进程可能需要访问share pool area 中的library cache以用来解析,在这种情况下,进程仅会在library cache中使用latch ,而非整个share pool。

于队列latch 不同(比如tx),latchs 不允许会话队列。当latch 变得可用时,请求latch的第一个会话获得对其的独占访问。当一个进程循环重复申请latch时,就会发生latch spining,在latch 重新发起一个请求之前,进程会释放CPU资源,转入睡眠。( whereas latch sleeping occurs when a process releases the CPU before renewing the latch request)

通常,oracle 进程请求一个latch来查看或者操作数据结构会在一个极短的时间,比如在更新一个员工的工资时,数据库可能获取,释放了上千个latch。latch 的实现与操作系统有关,特别是关于进程是否等待和等待多长时间的latch.

latch 的增加意味着并发的降低,比如过得硬解析操作会带来library cache latch的争用。v$latch 视图包含了latch的使用统计信息,包括latch的请求次数,等待时间。

Mutexes

mutual exclusion object(mutex) 是一种用来保护正在被访问的内存对象不被老化和损坏的低级机制,mutex和latch相似,但是一般来说latch保护一组对象,mutex保护单个对象。

mutex 的优点:

mutex 可以减低可能存在的竞争

mutex消耗的内存更小

当处于share mode,一个mutex允许被多个会话并发引用。

Internal Locks

internal locks 是服务于各种目的,比latch和mutex更高级别也更复杂的锁机制。

数据库使用以下几种internal locks

• Dictionary cache locks

当dictionary cache中的条目被修改或者被使用时,dictionary cache locks在条目上的持有时间非常的短。他们保证被解析的语句不会看到不一样的对象定义。dictionary cache locks 可以有share mode 或者exclusive mode。

当解析完成是会释放share locks,当DDL操作完成时,会释放exclusive locks。

• File and log management locks

这些锁保护多种文件,比如有一个内部锁保护控制文件,以让控制文件同时只有一个进程可以被修改。其他锁协调归档和在线日志文件。。。。不举例了,

• Tablespace and undo segment locks

这些锁保护表空间和undo 段,比如全部实例访问数据库必须知道表空间是否联机或者脱机,undo segments 锁住以确定只有一个实例可以写入。

终于写完。。。。还有的就不写了

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181226G1KI5O00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券