oracle锁机制

1. 锁类型
锁的开始和释放一般是由事务开始和结束决定的,锁最基本的类型分为独占锁(x锁)和共享锁(s锁)。

1.1 共享锁
共享锁又称为读锁,对数据库资源进行读的事务添加的锁,多个共享锁可以在同一个资源上共存的,它是非独占的。即多个事务可以同时并发读取同一个资源,但不同时并发执行写操作。

1.2 独占锁
独占锁又称为写锁,当对数据库进行写操作时会添加独占锁。独占锁对锁定的资源,只能有由持有该锁的事务进行操作。即如果事务A对数据库的某一资源添加了独占锁,那么该资源只能由事务A执行操作,其它事务必须等待事务A结束后释放掉该独占锁后,操作该资源。这就保证了同一时间只能一个事务对该资源执行操作。若某资源上添加了一个独占锁,那么不能再添加其它的独占锁或共享锁。

独占锁与共享锁之间的相容规则见下表:
这里写图片描述

2. 锁粒度
根据锁作用的对象的结构层次,将锁的粒度从高到底依次划分为:数据库、表、记录、列。锁的粒度越大,锁的开销就缺少,但是并发度就越低,粒度越小,开销就越大,并大度越高。

3. oracle中的锁

3.1 oracle多粒度封锁机制
oracle根据操作的对象不同,锁分为以下几类:

  • a) 数据锁(data locks,DML),用于保护数据的完整性;

  • b) 字典锁(dictionary locks,DDL),用于保护数据对象结构,例如表、视图、索引等;

  • c) 内部锁和闩(internal locks and latche),保护数据内部结构;

  • d) 分布锁(distributed locks),用于并行服务器中;

  • e) 并行高速缓存管理锁(pcm locks),用于并行服务器中。

    下面只对数据锁进行详细介绍:

    3.1.1 Oracle数据锁(DML锁)

    数据锁按照粒度分为两个层次:行级锁和表级锁。

    (1)行级锁
    行级锁,也称为TX锁,或事物锁,当一个事物第一次执行数据修改(insert、delete、update)或查找更新(select for update)时,会在执行的行上添加行级锁,行级锁都是X锁,没有S锁。在oracle数据行上,都有一个标志位来表示该行数据是否被锁定,锁标志一旦被置位,表示该行上添加了行级锁。

    (2)表级锁
    表级锁是对表添加的锁,当事物对表添加锁,要判断表上现有的锁是否相容,另外还要检查是否与每一行上的锁相容。例如当事物对表添加S锁,首先要判断表级别是否有相容的锁,还要判断每一行的锁是否相容,当行级锁存在X锁,那么该S锁的申请就会被阻塞。当表中数据量很大时,逐行检查锁标志,开销将很大,系统性能将会受到影响。为了解决这一问题,在表级引入新的锁类型来表示所属行的加锁情况。新的锁就是“意向锁”。

    意向锁的含义就是当对一个节点添加锁时,必须对该节点的上级节点添加意向锁,就是当对行添加锁时,必须对表级添加意向锁,这样新的事物对表添加锁时,就无需判断每一行的锁类型,只有判断该表级的意向锁即可。系统效率得到大大提高。根据锁的基本类型,意向锁分为意向共享锁(intent share lock,IS锁)和意向独占锁(intent exclusive lock ,IX锁)。当对行添加S锁,那么表级就是IS锁,当对行添加X锁,那么表级就是IX锁。由此可知,对数据库对象(比如表)添加的锁类型包括:S、X、IS、IX,另外这些锁在对象会出现组合添加,那么理论上的组合包括:S+IS=S、X+IX=X、X+IS=X、S+IX=SIX,可知,前三个组合锁的强度(对其它锁的排斥程度)都没有提高,最后一个组合形成了一个新的锁“共享意向独占锁”,即表级是共享锁,行级是独占锁,表示事务要读整个表,又要对若干行执行更新操作。
    oracle表级锁,也行TM锁,共有五种类型:S锁,X锁,行级共享锁(RS),行级独占锁(RX),共享行级独占锁(SRX)。另外,oracle在行级只有X锁,因此select for update在行级是X锁,但是在表级是RS锁,这个与意向锁的理论不同。各个锁之间的相容性见下表:
    这里写图片描述

    Oracle执行sql语句时,系统先获取表级锁TM,然后为操作的行添加TX。Oracle执行sql语句,添加的表级锁情况如下:
    这里写图片描述

    由以上可知,oracle执行select时,不添加任务锁,oracle通过回滚段来保证查询时不读取“脏”数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值