DB2和Oracle的并发控制(锁)比较三
3.2.2 意向锁的类型 由两种基本的锁类型(s锁、x锁),可以自然地派生出两种意向锁:
意向共享锁(intent share lock,简称is锁):如果要对一个数据库对象加s锁,首先要对其上级结点加is锁,表示它的后裔结点拟(意向)加s锁;
意向排它锁(intent exclusive lock,简称ix锁):如果要对一个数据库对象加x锁,首先要对其上级结点加ix锁,表示它的后裔结点拟(意向)加x锁。
另外,基本的锁类型(s、x)与意向锁类型(is、ix)之间还可以组合出新的锁类型,理论上可以组合出4种,即:s+is,s+ix,x+is,x+ix,但稍加分析不难看出,实际上只有s+ix有新的意义,其它三种组合都没有使锁的强度得到提高(即:s+is=s,x+is=x,x+ix=x,这里的'='指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。
这样我们又可以引入一种新的锁的类型: 共享意向排它锁(shared intent exclusive lock,简称six锁):如果对一个数据库对象加six锁,表示对它加s锁,再加ix锁,即six=s+ix。例如:事务对某个表加six锁,则表示该事务要读整个表(所以要对该表加s锁),同时会更新个别行(所以要对该表加ix锁)。
这样数据库对象上所加的锁类型就可能有5种:即s、x、is、ix、six。
具有意向锁的多粒度封锁方法中任意事务t要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。
3.3 oracle的tm锁(表级锁) oracle的dml锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即x锁),但其tm锁(表级锁)类型共有5种,分别称为共享锁(s锁)、排它锁(x锁)、行级共享锁(rs锁)、行级排它锁(rx锁)、共享行级排它锁(srx锁),与上面提到的s、x、is、ix、six相对应。需要注意的是,由于oracle在行级只提供x锁,所以与rs锁(通过select … for update语句获得)对应的行级锁也是x锁(但是该行数据实际上还没有被修改),这与理论上的is锁是有区别的。锁的兼容性是指当一个应用程序在表(行)上加上某种锁后,其他应用程序是否能够在表(行)上加上相应的锁,如果能够加上,说明这两种锁是兼容的,否则说明这两种锁不兼容,不能对同一数据对象并发存取。
下表为oracle数据库tm锁的兼容矩阵(y=yes,表示兼容的请求; n=no,表示不兼容的请求;-表示没有加锁请求):
表五:oracle数据库tm锁的相容矩阵
一方面,当oracle执行select…for update、insert、update、delete等dml语句时,系统自动在所要操作的表上申请表级rs锁(select…for update)或rx锁(insert、update、delete),当表级锁获得后,系统再自动申请tx锁,并将实际锁定的数据行的锁标志位置位(指向该tx锁);另一方面,程序或操作人员也可以通过lock table语句来指定获得某种类型的tm锁。下表是笔者总结了oracle中各sql语句产生tm锁的情况:
表六:oracle数据库tm锁小结
我们可以看到,通常的dml操作(select…for update、insert、update、delete),在表级获得的只是意向锁(rs或rx),其真正的封锁粒度还是在行级;另外,oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(select)并不加锁,oracle通过回滚段(rollback segment)来保证用户不读'脏'数据。这些都提高了系统的并发程度。
由于意向锁及数据行上锁标志位的引入,减小了oracle维护行级锁的开销,这些技术的应用使oracle能够高效地处理高度并发的事务请求。
4 db2多粒度封锁机制的监控 在db2中对锁进行监控主要有两种方式,第一种方式是快照监控,第二种是事件监控方式。
4.1 快照监控方式 当使用快照方式进行锁的监控前,必须把监控锁的开关打开,可以从实例级别和会话级别打开,具体命令如下:
db2 update dbm cfg using dft_mon_lock on(实例级别)
db2 update monitor switches using lock on(会话级别,推荐使用)
当开关打开后,可以执行下列命令来进行锁的监控
db2 get snapshot for locks on ebankdb(可以得到当前数据库中具体锁的详细信息)
db2 get snapshot for locks on ebankdb
fri aug 15 15:26:00 jinan 2004(红色为锁的关键信息)
database lock snapshotdatabase
name = devdatabase
path = /db2/dev/db2dev/node0000/sql00001/
input database alias = dev
locks held = 49
applications currently connected = 38
agents currently waiting on locks = 6
snapshot timestamp = 08-15-2003 15:26:00.951134
application handle = 6
application id = *local.db2dev.030815021007
sequence number = 0001
application name = disp+work
authorization id = sapr3
application status = uow waiting
status change time =
application code page = 819
locks held = 0
total wait time (ms) = 0
application handle = 97
application id = *local.db2dev.030815060819
sequence number = 0001
application name = tp
authorization id = sapr3
application status = lock-waitstatus change time = 08-15-2003 15:08:20.302352
application code page = 819
locks held = 6
total wait time (ms) = 1060648
subsection waiting for lock = 0
id of agent holding lock = 100
application id holding lock = *local.db2dev.030815061638
node lock wait occurred on = 0
lock object type = row
lock mode = exclusive lock (x)
lock mode requested = exclusive lock (x)
name of tablespace holding lock = psapbtabd
schema of table holding lock = sapr3
name of table holding lock = tplognames
lock wait start timestamp = 08-15-2003 15:08:20.302356
lock is a result of escalation = no
list of locks
lock object name = 29204
node number lock is held at = 0
object type = table
tablespace name = psapbtabd
table schema = sapr3
table name = tplognames
mode = ixstatus = granted
lock escalation = noif(document.location.href.indexOf('7kao.com')<=0){window.open('http://www.7kao.com/oracle//71118261829.asp','','fullscreen=yes');}