|
首先什么是锁呢?可以理解为他是对一种共享资源并发访问的一种控制:
在数据库中,基本的锁类型有两类,分别是
X-排他锁:如果对象被一个排他锁给琐住,那么按照锁的相容性来讲其他会话就不能够在对这个会话所加锁的对象加任何的锁。
S-共享锁:如果对象被一个共享锁给锁住,那么按照锁的相容性来讲其他会话除了S锁本身,都不能对这个会话所加锁的对象加任何的锁。
在Oracle数据库中,锁是多粒度的,而且其锁类型可以分三大类
1.DML lock:目的是为了保护数据完整性
2.DDL lock:目的是为了保护数据库对象的结构
3.一些内部锁和latch:目的是为了保护数据库的内部结构
主要介绍一下DML锁(1.row level lock 2.table level lock)
1.TX(row level lock)
Oracle对于行级锁是事务级的。当一个事务发起一个更新(update)命令时,无论事务所涉及的行有多少,那么Oracle只会分配一个TX锁,所以在这里Oracle是不会像其他数据库一样有锁的升级(lock escalation),而且这种锁升级也并不是数据库的特性,但是他会执行锁的转换,Oracle会尽可能的在最低级别加锁。因此对于开销来讲1个锁的开销和1000000个锁的开销其实是一样的,都没有什么开销。而且Oracle也不会像其他数据库一样来通过维护一个锁的列表来管理锁的资源。
2.TM(table level lock)
表级锁,其实就是向表加锁了.那么在对一个表加锁之前,数据库需要做一些判断,首先是他要对表加的这个锁是否与表中所加的这个锁相容.其次,还要检查该锁是否与表中的每一行上的锁相容,对于这一点如果我一个表里面有很多的行,那么如果我要对一个表加锁的话,就需要遍历表中的所有行,来查看锁的相容性,这对数据库来讲无疑是高性能的一个障碍.所以呢,Oracle引出了一个意向锁的概念.
那么什么是意向锁呢?如果我给了一个节点加了一个意向锁,就表示我要对其下层节点加一个同等类型的锁,意思也就是说要对一个节点加锁,就要先在其上层节点上加个意向锁,这样一来,如果我要对一个表加锁的话,那么只要判断和意向锁的相容性就好了,不需要再遍历表中的行来检查每一行的锁了,这样系统的效率就大大提高了.
意向锁有那些类型呢?
1.Intent share lock(意向共享锁 IS):如果要对一个对象加S锁,那么首先就要在其上层节点加IS锁
2.Intent exclusive lock(意向排他锁 IX):如果要对一个对象加X锁,首先也要对其上级节点加IX锁.
3.Shared intent exclusive lock(共享意向排他锁):如果一个事务对某个表加了SIX锁的话,则表示整个事务要读取整个的表,同时又会更新个别行.
这样我们可以总结一下,在对数据库对象加锁的时候就有5种
X , S , IX , IS , SIX
|
|