Oracle 锁机制介绍
根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如 表、视图、索引的结构定义); internal locks,latches,mutex,pin:保护内部数据库结构;Oracle DML锁共有两个层次,即行级锁(TX)和表级锁(TM)。
一 .Lock 锁
1.锁介绍
我们在谈到性能优化的时候,通常是讲系统缓慢的时候需要性能优化,系统缓慢通常是由什么原因导致的呢?大概上讲分为两种
- 系统的资源耗尽了(cpu耗尽了,IP,吞吐量上不去)性能枯竭,性能达到了极限。
- 锁定,阻塞,发现系统性能很高,但应用程序性能就是上不去,这种情况通常来讲是阻塞。
模拟锁的情况:
窗口一:建一张表,插入一条数据,id上有主键
窗口二:再往这张表id列插入一条同样的数据
由于primary key本质上是 unique key + not null ,由于第二个事务不知道第一个事务是提交还是回滚,如果提交则事务二插入失败,如果回滚则插入成功,此时会造成锁阻塞。
窗口一:
窗口二:
2.Oracle中锁的大体分类
Enqueues : 队列类型的锁,通常和业务相关的锁。
Latches: 系统资源方面的锁,比如内存结构,SQL解析等
锁的所有类型可以根据视图v$lock_type 查看
环境oracle 19c 共291种 锁。
.........
3.锁的原则
- 只有被修改时,行才会被锁定。
- 当一条语句修改了一条记录,只有这条记录上被锁定,在Oracle数据库中不存在锁升级。
- 当某行被修改时,它将阻塞别人对它的修改。
- 当一个事务修改一行时,将在这个行上加上行锁(TX),用于阻止其它事务对相同行的修改。
- 读永远不会阻止写。
- 读不会阻塞写,但有唯一的一个例外,就是select …for update。
- 写永远不会阻塞读。
- 当一行被修改后,Oracle通过回滚段提供给数据的一致性读。
这里其实听过其它很多人说过Oracle锁升级的概念,根据一下Oracle资料调查Oracle不存在锁升级,但确实存在锁转换。
数据库在必要时执行锁转换。在锁转换中,数据库自动将较低限制的表锁转换为较 高限制的其它锁定。(锁转换不同于锁升级,锁升级发生在当某个粒度级别持有许多锁(例如行),数据库将其提高到更高粒度级别(例如表)Oracle数据库永远不会升级锁。
Oracle的锁是block里面实现的,(SQLSERVER、DB2是内存里面实现的。内存实 现有资源消耗问题,当内存不足会引发锁升级)但是Oracle不会发生锁升级。
事务拥有在此事务内被插入(insert)、更新(update)、删除(delete)的数 据行的排它行级锁(exclusive row lock)。对于数据行来说,排它行级锁已经是 限制程度最高的锁,因此无需再进行锁转换(lock conversion)。
4.TM锁和TX锁
- TM表锁,发生在insert,update,delete以及select for update操作时,目的是保证操 作能够正常进行,并且阻止其它人对表执行DDL操作。<