数据库的锁问题

事务的并发控制协议

oracle采用类似于多版本两段锁的协议(multiversion two-phase lock protocol)

多版本两段锁协议对只读事务和更新书屋加以区别,如果是只读事务则采用多版本控制协议,如果是更新事务则采用强两段锁协议。

锁分共享锁(shared)和排他锁(exclusive)
数据库对每个数据项Q,建立多个版本<Q1,Q2,…,Qm>,每个版本有有三个数据字段:
content:Qk的值
w-timestamp:创建Qk版本的事务的时间戳值

如果事务Ti要读Q的值:首先要获得这个数据项上的共享锁,其次要找出Qk,它具有小于或者等于TS(Ti)的最大写时间戳,最后读出其content字段的值,释放共享锁

更新事务要写Q的值,首先要获得该数据项上的排他锁,然后为此数据项创建一个新的版本,在新的版本上进行修改,新版本的时间戳最初设置为无穷大,则没有事务可以读取它,最后事务提交后,则将新版本的写时间戳设置为更新事务的时间戳,并释放排他锁。

多粒度封锁(granularity)
    在事务的并发协议中,引入了锁的概念,加锁的粒度需要进行控制,我们可以对于各种各样大小的数据粒度加锁,小粒度数据项嵌套在大粒度数据项中。在我们对一个节点加锁的时候,同时也隐含的对这个节点的所有子节点加锁。
    在oracle中数据粒度分为表和数据记录,在我们对这个表加锁的同时,也隐含这我们对这个表的所有数据记录加锁

    意向锁的引入:假设我们现在对一个表的一个数据记录加了锁,现在另外一个事务则要对整个表加锁,则首先要判断表节点的锁节点类型是否兼容,同时还要判断这个表节点的所有后裔节点所加的锁是否和其兼容,这样效率非常低。所以我们引入了意向锁(intention lock mode)来解决这个问题,在一个节点显式加锁之前,该节点的全部祖先匀加上了意向锁。
    事务判定能否成功给一个节点加锁时候,不必去搜索从根到这个节点和这个节点所有后裔节点的路径,之用搜索从根节点到这个节点的路径是否兼容就可以了
    基本的锁类型有S,X与意向锁类型(IX,IS),这两种锁互相组合还可以组合出来四种
    S+IX:在这个节点上显式加S锁,这个节点的后裔节点上隐式加S锁,在这个节点上加IX锁,在这个节点的后裔节点上加X锁
    S+IS:在这个节点上加S锁,这个节点的后裔节点上隐式的加S锁,在这个节点上加IS锁,在这个节点的后裔节点上加S锁,所以说这种类型并不能给我们带来什么方便,起到的所用完全和S锁一样,所以不考虑
X+IS:
X+IX:


意向锁在oracle中的表示就是rx(row exclusived),rs(row shared),srx(shared+row exclusived)
  这样在oracle中使用的类型就有五种:S,X,RX,RS
  如果一个事务要对一个数据对象加锁,则必须对它的上层节点加意向锁,比如说要对表的一条记录加S锁,则必须对这个表加RS锁

oracle锁的分类
1.      DML锁:用于保护数据的完整性
Dml锁,又称数据锁,从封锁的粒度看,oracle dml锁又两个层次,行级锁和表级锁
(1)      行级锁(TX)
当一个事务进行DML操作或者使用select…for update语句进行查询的时候,会对所操作的行产生一个TX锁,直到这个事务被commit/rollback
TX锁是行级别的,一个TX锁可以锁定多行
(2)      表级锁(TM)
表级锁分为(2,row share)(3,row exclusive)(4,share)(5,share row exclusive)(6,exclusive)

2.      DDL锁:dictionary locks字典锁,用于保护数据库对象的结构(例如table,view,index的结构定义)
3.      internal locks和latch(内存锁)
4.      distributed locks(分布式锁)
5.      pcm locks(并行高速缓存管理锁)


意向锁
  意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排他 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级配置意向锁可防止另一个事务随后在包含那一页的表上获取排他 (X) 锁。意向锁能够提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否能够安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否能够锁定整个表。
  
  意向锁包括意向共享 (IS)、意向排他 (IX) 连同和意向排他共享 (SIX)。
  
  锁模式 描述
  意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。
  意向排他 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。 www.bitsCN.com
  和意向排他共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其他事务对资源进行更新,但是其他事务能够通过获取表级的 IS 锁来读取层次结构中的底层资源。 

你可能感兴趣的:(数据结构,oracle,sql,SQL Server,配置管理)