Oracle 深入理解Lock和Latch ,解析访问数据块全流程

Oracle 锁机制介绍

根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如 表、视图、索引的结构定义); internal locks,latches,mutex,pin:保护内部数据库结构;Oracle DML锁共有两个层次,即行级锁(TX)和表级锁(TM)。

一 .Lock 锁

1.锁介绍

我们在谈到性能优化的时候,通常是讲系统缓慢的时候需要性能优化,系统缓慢通常是由什么原因导致的呢?大概上讲分为两种

  1. 系统的资源耗尽了(cpu耗尽了,IP,吞吐量上不去)性能枯竭,性能达到了极限。
  2. 锁定,阻塞,发现系统性能很高,但应用程序性能就是上不去,这种情况通常来讲是阻塞。

模拟锁的情况:

窗口一:建一张表,插入一条数据,id上有主键

窗口二:再往这张表id列插入一条同样的数据

由于primary key本质上是 unique key + not null ,由于第二个事务不知道第一个事务是提交还是回滚,如果提交则事务二插入失败,如果回滚则插入成功,此时会造成锁阻塞。

窗口一:

窗口二:

2.Oracle中锁的大体分类

Enqueues : 队列类型的锁,通常和业务相关的锁。

Latches: 系统资源方面的锁,比如内存结构,SQL解析等

锁的所有类型可以根据视图v$lock_type 查看

环境oracle 19c 共291种 锁。

 .........

3.锁的原则

  1. 只有被修改时,行才会被锁定。
  2. 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。
  3. 当某行被修改时,它将阻塞别人对它的修改。
  4. 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。
  5. 读永远不会阻止写。
  6. 读不会阻塞写,但有唯一的一个例外,就是select …for update。
  7. 写永远不会阻塞读。
  8. 当一行被修改后,Oracle通过回滚段提供给数据的一致性读。

这里其实听过其它很多人说过Oracle锁升级的概念,根据一下Oracle资料调查Oracle不存在锁升级,但确实存在锁转换。

数据库在必要时执行锁转换。在锁转换中,数据库自动将较低限制的表锁转换为较 高限制的其它锁定。(锁转换不同于锁升级,锁升级发生在当某个粒度级别持有许多锁(例如行),数据库将其提高到更高粒度级别(例如表)Oracle数据库永远不会升级锁。

Oracle的锁是block里面实现的,(SQLSERVER、DB2是内存里面实现的。内存实 现有资源消耗问题,当内存不足会引发锁升级)但是Oracle不会发生锁升级。

事务拥有在此事务内被插入(insert)、更新(update)、删除(delete)的数 据行的排它行级锁(exclusive row lock)。对于数据行来说,排它行级锁已经是 限制程度最高的锁,因此无需再进行锁转换(lock conversion)。

 4.TM锁和TX锁

  1. TM表锁,发生在insert,update,delete以及select for update操作时,目的是保证操 作能够正常进行,并且阻止其它人对表执行DDL操作。<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值