DB2与Oracle并发控制(锁)的比较

DB2与Oracle并发控制(锁)的比较
1引言
在关系数据库(DB2、Oracle、Sybase、Informix和SQL Server),最小交易单位是一个恢复交易(交易),交易(原子性、一致性、有酸隔离和持久性)的特点。为了保证并发用户访问同一个数据库对象的正确性,即关系数据库,有没有丢失更新、可重复读或不读脏数据,幻读和并发(锁定)机制引入到数据库。有锁的两种基本类型:排它锁锁(X锁)和共享锁(共享锁被记录为S锁)。
互斥锁:如果事务t将x锁添加到数据d,那么任何其他事务都不能在D释放X锁之前将任何类型的锁添加到D。一般来说,在修改数据之前需要向数据添加一个锁,因此独占锁也被称为写锁。
共享锁:如果事务t将s锁添加到数据d,其他事务只能在D释放D锁到x,而不是x锁。d一般需要在读取数据之前向数据添加共享锁,因此共享锁也称为读锁。
2 DB2多粒度阻塞机制介绍
2.1锁定对象
DB2支持锁定的表空间、表、列和索引(大型数据库也可以支持数据页面锁定)来保证并发性和完整性的数据库。但是,在用户应用程序的并发性的考虑,用于表空间和索引的锁通常不检查。这类问题重点分析表锁和锁。
2.2锁定策略
DB2可以锁定表,也可以锁在表和表的行。如果表锁定,表中的所有行均由同一程度的影响。如果锁定范围是表和下级行,相应的数据线将锁后添加到表锁定。应用程序是否是在同一时间进行添加表和表锁或行锁是通过测定中的应用隔离级别的指挥和执行系统。
2.2.1 DB2表锁模式
可以使用以下锁定方法锁定DB2在表1:

表1:DB2数据库表锁的模式

进一步解释了几种表锁的以下模式:
是,IX和六用于表1,需要锁定在一起,它们可以防止其他应用程序将其添加到表中。
如果应用程序获得表的锁,应用程序可以在行上获得一个用于只读操作的s锁,而其他应用程序也可以读取行或更改表中的其他行。
如果应用程序获得表的IX锁,应用程序可以获得行上的X锁来更改操作,而其他应用程序可以读取或更改表中的其他行。
如果应用程序获得一个表的六个锁,应用程序可以获得一行上的X锁来更改操作,而其他应用程序只能读取表中的其他行。
s、u、x和z在表1中使用,但不需要锁协调,这是一种相对严格的表锁定策略。
如果应用程序获取表的s锁,应用程序可以读取表中的任何数据。它还允许其他应用程序在表上获得只读请求锁。如果应用程序需要更改表上的数据,则必须等待s锁被释放。
如果一个应用程序获取表中的U型锁,应用程序可以读取表中的任何数据,最后得到正确的修改任何数据表中获得表上的X锁,其他应用程序可以读取表中的数据。U锁和锁的区别在于主要是在改变的意图,U锁的设计主要是为了避免由两个应用程序申请X锁同时锁造成的死锁。
如果应用程序在表上获得X锁,应用程序可以读取或修改表中的任何数据。其他应用程序不能读取或更改表上的操作。
如果应用程序获得表上的z锁,应用程序可以读取或修改表中的任何数据。其他应用程序,包括未提交的读数,不能读取或更改表。
在表中使用锁允许未提交阅读的概念。
2.2.2 DB2的行锁模式
除了表锁之外,DB2还以以下方式支持行锁。

表二:DB2数据库行锁的模式

2.2.3 DB2锁的兼容性

表三:DB2数据库表锁的兼容矩阵
表四:DB2数据库行锁的兼容矩阵

下一个表是作者总结了在DB2中每个SQL语句中生成表锁的情况(假设默认隔离级别是cs):
2.3 DB2锁升级
每个锁在内存中需要一定的内存空间。为了减少锁需要的内存开销,DB2提供的锁升级功能。锁升级是通过释放行锁表通过增加非故意的表锁减少锁的数量,从而降低锁的内存成本。锁升级的数据库管理器自动完成,并配置参数两数据库直接影响锁升级处理。
锁列表是用来锁定存储在数据库全局内存。单位是一个页面(4K)。
MAXLOCKS --应用程序允许占用的锁定内存占锁列表大小的内存的百分比。
锁升级是在这两种情况下触发的:
通过应用程序请求的锁占用的内存空间超出MAXLOCKS和锁列表产品尺寸。在这一点上,数据库管理器将尝试利用申请表锁的应用使锁的请求和释放行锁,节省空间。
所有的锁已经在数据库中添加内存占用超出锁列表定义的大小。在这一点上,数据库管理器还将尝试利用申请表锁的应用使锁的请求和释放行锁,节省空间。
锁升级可以降低OLTP应用程序的并发性,但锁升级将记忆锁的释放和增加可用的锁的内存空间。
锁升级可能会失败,例如,现在的应用程序已经在一张IX锁,一些与X锁表中的行,另一个应用程序要求在桌子上的锁,在锁的多行,因为应用过度锁升级锁数。数据库管理器试图将S锁的形式来减少锁需要的数量的应用,但在桌子上的锁冲突原IX锁,和锁升级不成功。
如果锁升级失败,导致锁升级应用程序将获得一个912的SQLCODE。锁升级失败后,DBA应该考虑增加LOCKLIST和MAXLOCKS增加百分比的大小。同时,程序员可以重新提交交易程序后锁升级程序回滚(例如,如果SQLCA. SQLCODE = 912然后回滚和重试,等)。
3 oracle多粒度锁机制介绍
根据不同的保护对象,Oracle数据库锁可以分为以下几类:
(1)DML锁(数据锁,数据锁):保护数据的完整性;
(2)DDL锁(锁锁字典,词典):保护数据库对象的结构(如表、视图、索引结构的定义);
(3)内部锁和锁存器(内部锁和锁存器):保护内部数据库结构;
(4)分布式锁(分布式锁):用于OPS(并行服务器);
(5)PCM锁(并行缓存管理锁):用于OPS(并行服务器)。
最重要的是在Oracle DML锁(也称为数据锁,数据锁)锁。从封锁粒度的角度(对被遮挡物体的大小),Oracle DML锁有两个层次,行级锁和表级锁。
3.1 Oracle TX锁(线锁,事务锁)
许多人不太了解Oracle可能认为各TX锁代表了封锁线的数据,但它不是。TX的原义是交易(交易),交易时,首先执行数据修改(插入、更新、删除)或使用SELECT…FOR UPDATE语句进行查询时,它获得一个TX(交易)锁直到事务结束(提交或回滚操作时执行),锁被释放。所以,TX锁可以对应于一定数量的由事务锁定的数据线。(当我们使用它时,它开始一个事务,然后选择…FOR UPDATE NOWAIT)。
在每一行的数据,有一个标志位指示行的数据锁定,Oracle不会建立一个链表来维护每一行的数据锁定,不像DB2,从而大大降低了行级锁的维护成本,也在很大程度上避免了锁升级往往是没有类似于DB2使用行级锁的情况。一旦在数据线的锁定标记放置,表明行数据加X锁,Oracle已经没有S锁在数据线。
3.2 TM锁(表锁)
3.2.1意向锁引起的
桌子是由行组成的。当我们锁定一个表时,我们需要检查这个锁的应用程序是否与原来的表锁兼容。另一方面,我们需要检查是否锁上表中每行的锁兼容。例如,一个事务应该加的锁在桌子上,如果一个表中的行已被添加到与X锁的其他事务,为锁定的应用也应该被阻止。如果有大量的表中的数据,通过查线锁标志线的开销会很大,并对系统的性能会受到影响。为了解决这个问题,一个新的锁类型可以在表级表示了其排锁,导致意向锁的概念。
意向锁的含义是,如果一个节点添加了意图锁,则表示节点的下一个节点正在被锁定。如果任何一个节点被锁定,必须先加意向锁的上部节点。如果表中的任何行锁、意向锁必须被添加到该表的位置,然后行锁定。这样,当交易被锁定的表,它是不再需要检查每一行的锁标记表中,并大大提高了系统的效率。
2.2意向锁型
由两种基本类型的锁(锁,x锁),两个故意锁可以自然派生。
意向共享锁(是锁):如果我们想将s锁添加到数据库对象中,首先需要将锁添加到它的上级节点,这意味着它的后代节点打算(意图)加锁。
意向互斥锁(IX锁定):如果我们想向数据库对象添加X锁,首先需要向它的上级节点添加一个IX锁,这意味着它的后代节点是有意的(意图)加X锁。
此外,锁的基本类型(s,x)与锁式的意图(是,九)也可以结合新的锁类型,理论上可以组合成4,即:S +,+ IX,X,X +九,但稍加分析不难看出,事实上只有S +九有了新的含义,其他三种组合不提高锁的强度(即:S = S,X = X,X +九= x,这里的=是指实力的同时锁)。所谓锁的强度是指其他锁排斥程度。
这样,我们还可以引入一种新类型的锁:
共享意向排他锁(六锁):如果六个对象添加到一个数据库对象,这意味着增加的锁,加IX锁,即六= S + ix.for的例子,一个交易增加六的锁表,这意味着交易要读取整个表(所以S锁添加到表中),和它更新一些个人行(所以IX锁表中添加)。
在数据库对象中添加了5种类型的锁:s、x、、、、六。
在带有意图锁的多粒度封锁方法中,一个任意锁数据库对象的事务T必须首先向上一个节点添加一个锁。当我们释放封锁时,我们应该以自下而上的顺序进行。采用意图锁的多粒度锁方法提高了系统的并发性,降低了锁锁和解锁的成本。
3.3 oracle锁(表锁)
Oracle DML锁(锁数据)用于多粒度锁的方法如上所述,行级锁虽然只有一个(即X锁)但TM锁(锁)共有5种类型,称为共享锁(S锁),独占锁(X锁),行级锁(RS锁),行级锁(RX锁),共享行排他锁(SRX锁),对应于上述的,X,IX,六。值得注意的是,由于Oracle提供的只是在行级X锁,它被锁定在RS(通过选择…的更新语句获得)相应的行级锁也是一个X锁(但线数据不修改),这是不同于理论是锁锁兼容性参考。RS到一个应用程序在表(行)加上一个锁时,是否其他应用程序可以在表(行)与相应的锁,如果我们可以添加这两个锁是兼容的,否则两个锁是不兼容的,而不是同一个数据对象并发访问。
下表是Oracle数据库TM锁的兼容矩阵(y =是,兼容请求;n = NO,不兼容请求;-没有锁定请求):

表五:Oracle数据库TM锁的兼容性矩阵

另一方面,当Oracle执行SELECT…当更新、插入、更新、删除等DML语句,系统自动将表级RS锁在桌上操作(选择…)更新)或接收(插入,更新,删除锁),当表级锁系统自动发送锁定收购后,数据线和实际锁标记位置(指向TX锁);另一方面,程序或操作人员也可以使用LOCK TABLE语句指定获得某种类型的TM锁。下表是作者总结了在TM的锁Oracle数据库中的每个SQL语句生成的情况。

表六:Oracle数据库TM锁摘要

我们可以看到,通常的DML操作(选择…更新,插入,更新,删除),是用来在表级锁(RS获取或接收),真正的锁定粒度或行水平;此外,对Oracle数据库的一个显著特点是,默认情况下,简单的读取数据(选择)不是由Oracle回滚段锁定(回滚段)以确保用户不读脏数据。这些都提高了系统的并发度。
由于引入了符号锁和数据行锁位,Oracle维护行级锁的开销减少了。这些技术的应用使Oracle能够高效地处理高度并发的事务请求。
4种DB2多粒度阻塞机制的监控
DB2中有两种监视锁的主要方法,第一种是快照监控,第二种是事件监控。
4.1快照监控
当使用快照监视锁时,必须打开监视器锁开关,该开关可以从实例级和会话级打开,具体命令如下所示:

在使用DB2更新DBM CFG dft_mon_lock(实例)
DB2更新监视器开关使用锁定(会话级别,推荐)
当开关打开时,可以执行以下命令来监视锁
DB2获得锁,ebankdb快照(你可以在当前数据库中得到特定锁的细节)
DB2获得锁,ebankdb快照
8月15日星期五15:26:00济南2004(红锁定关键信息)
锁定数据库快照
数据库名称=开发
数据库路径= / / / db2dev DB2开发 / / / sql00001 node0000
输入数据库别名
锁持有= 49
当前连接的应用程序= 38
当前正在等待锁的代理= 6
快照的时间戳08-15-2003 15:26: = 0.951134
应用程序句柄= 6
应用程序ID = * local.db2dev.030815021007
序列号= 0001
应用名称= DISP +工作
授权ID = SAPR3
应用现状= UOW的等待
状态更改时间=
应用程序代码页= 819
锁持有= 0
总等待时间(ms)= 0
应用程序句柄= 97
应用程序ID = * local.db2dev.030815060819
序列号= 0001
应用程序名称= TP
授权ID = SAPR3
应用程序状态=锁定等待
状态变化时间= 08-15-2003 15:08: 20.302352
应用程序代码页= 819
锁持有= 6
总等待时间(ms)= 1060648
分段等待锁定= 0
代理持有锁= 100的id
应用程序ID保持锁= * local.db2dev.030815061638
节点锁等待发生在= 0
锁定对象类型=行
锁定模式=独占锁(x)
锁模式请求=独占锁(x)
表空间保持锁= psapbtabd名称
表保持锁= SAPR3图式
表保持锁= tplognames名称
锁等待开始时间= 08-15-2003 15:08: 20.302356
锁是升级的结果
表锁
锁定对象名称= 29204
节点号锁定保持在= 0。
对象类型=表
表空间的名字= psapbtabd
表模式= SAPR3
表格名称= tplognames
模式= IX
状态=授予
锁定升级=否
DB2获得对| dbname执行数据库快照我锁(UNIX,Linux平台)
当前持有的锁= 7
锁定等待= 75
时间数据库等待锁(MS)= 82302438
使用中的锁列表内存(字节)= 20016
检测到死锁= 0
Lock escalations = 8
独占锁升级= 8
当前正在等待锁的代理= 0
锁超时= 20

DB2获得对| dbname数据库快照发现 /我的锁(NT)
DB2获得应用agentid 45锁快照(注:45应用程序处理)
应用程序句柄= 45
应用程序ID = * local.db2dev.030815021827
序列号= 0001
应用程序名称= TP
授权ID = SAPR3
应用现状= UOW的等待
状态更改时间=
应用程序代码页= 819
锁持有= 7
总等待时间(ms)= 0
表锁
锁定对象名称= 1130185838
节点号锁定保持在= 0。
对象类型=键值
表空间的名字= psapbtabd
表模式= SAPR3
表格名称= tplognames
模式= x
状态=授予
锁定升级=否
锁定对象名称= 14053937
节点号锁定保持在= 0。
对象类型=行
表空间的名字= psapbtabd
表模式= SAPR3
表格名称= tplognames
模式= x
状态=授予
锁定升级=否
您还可以执行较低的列表功能(注意:在DB2 V8引擎之前,您只能传递命令,而DB2 V8可用于通过表函数监视表函数的锁)。
DB2查询表(snapshot_lock('dbname ',- 1))为locktable监控锁定信息
DB2查询表(snapshot_lockwait('dbname ',- 1)为lock_wait_table锁等待信息监测中的应用
4.2事件监测方法:
当我们使用事件监视器监视锁时,我们只能监视死锁。死锁的发生是由于锁请求的冲突,不能终止事务,请求冲突不能在事务中解决。通常,两个应用程序彼此需要锁,并且不释放现有锁而不需要锁。具体步骤如下:
DB2创建死锁的详细事件监视器dlock写入文件
DB2事件监控dlock状态1
db2evmon数据库dbname - EVM dlock具体见僵局输出(如下图所示)
僵持不下的连接…
死锁ID:4
参赛者编号:1
参加者编号:持有锁:2
产品编号:g9b58b1e.d4ea.08d387230817
应用序列号:0336
连接着锁的应用ID:g9b58b1e.d573.079237231003
序列。持有锁的连接数:0126
锁等待开始时间:06 / 08 / 2005 08:10: 34.219490
名称:0x000201350000030e0000000052锁
属性:0x00000000锁
释放信号:0x40000000
锁定计数:1
保持计数:0
当前模式:ns共享(和下一个密钥共享)
死锁检测时间:06 / 08 / 2005 08:10: 39.828792
锁表等待:订单
Schema of lock waited on: DB2INST1
锁等待:USERSPACE1表空间
锁类型:行
锁定模式:ns共享(和下一个密钥共享)
在锁上请求的模式应用程序:x独占
节点锁定发生在:0
锁定对象名称:782
应用程序句柄:298
僵持的声明:
类型:动态
操作:执行
34部分:
创作者:nullid
包装:syssn300
光标:sql_cursn300c34
游标被阻塞:false
正文:更新订单设置totalshipping totaltax =,=,
锁定totaltaxshipping =,= =,地位,专业timeplaced =,=,
3货币=,= =,序列,ormorder totaladjustment =,=,
shipascomplete =,providerordernum产品=,= =,
member_id =,orgentity_id =,= storeent_id field1,ordchnltyp_id =,=,
address_id =,= =最后更新,评论,notificationid orders_id = = = =,=,=,notificationid orders_id
锁列表:
名称:0x000201350000030e0000000052锁
属性:0x00000000锁
释放信号:0x40000000
锁定计数:2
保持计数:0
锁定对象名称:782
对象类型:行
名称:USERSPACE1表空间
表模式:db2inst1
表名称:订单
模式:x -独占
Lock Name: 0x00020040000029B30000000052
属性:0x00000020锁
释放信号:0x40000000
锁定计数:1
保持计数:0
锁定对象名称:10675
对象类型:行
名称:USERSPACE1表空间
表模式:db2inst1
表格名称:bkorditem
模式:X专有(略读回信息)

5 oracle多粒度封锁机制的监控
为了监视Oracle系统中锁的状态,我们需要了解一些系统视图:
5.1伏锁定视图
V锁定视图列出当前系统持有或正在应用的所有锁,其主要字段如下所示:

表七:V锁定视图的主要字段描述

在类型字段的值,本文只关心两种TM和TX.锁定类型
5.2 V locked_object美元的观点
V $ locked_object视图列出对象在当前的系统被锁定,和主要领域如下:

表八:V locked_object美元视图字段描述

5.3 Oracle锁监视脚本
根据上面的系统视图,可以编译一个脚本来监视数据库中锁的情况。
5.3.1 showlock.sql
第一个脚本,showlock.sql,显示哪些对象是通过连接V locked_object美元和all_objects两视图锁定。
showlock.sql / * * /
柱o_name格式A10
柱lock_type格式A20
柱object_name格式A15
选择RAPD(oracle_username,10)o_name,session_id希德,
解码(locked_mode,0,不关的,1,'null ',2,'row分享,
3、'row独家',4,'share ',5,'share行独家',6,'exclusive)lock_type,
object_name,xidusn,xidslot,xidsqn
从V locked_object美元,all_objects
其中V locked_object object_id = all_objects.object_id美元;
5.3.2 showalllock.sql

第二脚本showalllock.sql,主要信息显示所有当前TM和TX锁;
showalllock.sql / * * /
选择类型,Id1、Id2 SID,
解码(lmode,0,不关的,1,'null ',2,'row分享,
3、'row独家',4,'share ',5,'share行独家',6,'exclusive)
lock_type,请求,CTime,块
从v锁定
在式('tx ','tm);
6 DB2多粒度阻塞机制示例
下面的例子是运行在DB2 UDB和适用于所有数据库版本。首先,打开三个命令行窗口(DB2 CLP),其中2(以下简称SESS # 1,成功# 2)为db2admin连接数据库的用户,提供样品中表样本库的操作(员工);另一个(以下简称SESS # 3)为db2admin连接数据库的用户,执行每一个类型的SQL语句监控锁;希望读者对SQL语句,这样每个类型的监测。(因为样本量是非常大的,我不在这里做,建议读者使用类似方法验证锁的情况)。
/家/ db2inst1 > db2 +c更新员工通讯= 9999(SESS # 1)
/home/db2inst1>db2 +c select * from employee (SESS#2 in lock wait)
/家/ db2inst1 > db2 +c获得锁样品快照(SESS # 3监测和锁定)

注意:DB2不是自动提交(提交)SQL语句,或者使用C关闭自动提交(默认是自动提交)的DB2更新命令选项。
7总结
一般来说,DB2的锁和Oracle的锁之间有很大的区别:
1。Oracle进行并发控制通过多粒度与意向锁机制来保证数据的一致性阻塞。DML锁(数据锁)是分为两个层次:表级和行级。通常的DML操作只得到意向锁(RS和RX)在表级,其真正的封锁粒度仍在排级。DB2还控制并发的多粒度与意向锁的锁紧机构,从而保证了数据的一致性。DML锁(数据锁)是分为两个层次:表级和行级锁。只是平常的DML操作在意向表级(是六或九),其真实尺寸在排级堵塞;此外,在Oracle数据库中,读取的数据(选择)没有被锁定,这将提高系统的并发程度,Oracle的重点是读的数据,并能快速读取数据,DB2锁强调读一致性。当读取数据(选择)时,它将根据不同的隔离级别添加s、、和是锁定(RR、RS、cs)。只有当使用UR隔离级别时,它才不会被锁定,这可以确保不同应用程序读取的数据与用户读取的数据相一致。
2。同时对高并发的支持,在控制锁机制是不同的:Oracle,DB2和Oracle使用意向锁和数据线锁标志的设计技巧,降低Oracle行级锁的维护成本,具有数据库的并发控制方面具有一定的优势。在DB2中,每个锁将锁内存分配一定字节的内存空间(LOCKLIST),特别是X锁的锁64字节的存储器,32字节的存储器。注意:在72字节内存、s锁定36字节内存之前,db2 V8是X锁。
在3中没有锁升级。Oracle数据库,和锁升级发生在DB2数据库时,数据库表中的行锁的使用超出MAXLOCKS LOCKLIST *。
4。在Oracle时,插入,更新,删除另一个会话,会话的图像仍然可以读取表中的回滚段表空间在数据库管或恢复(图像);当会话表的插入,更新,删除在DB2中,另一个会话仍然读表锁等待状态的数据时,除非你的隔离级别可以读第一届自由价值;以一种不同的会话读不一致的现象,Oracle,DB2的时刻会议都在同一时间是读。
8结语
DB2中并发控制(锁)的建议
1。正确调整与锁列表、MAXLOCKS,dlchktime关联的数据库配置参数和LockTimeout(LockTimeout最好不等于1)。如果锁内存不足时,它会报告错误和影响sql0912并发。
2。编写高效简洁的SQL语句(非常重要)。
三.在处理业务逻辑之后,尽可能快地释放锁。
4、创建SQL语句导致锁等待最合理的指标(sql0911返回代码68)和死锁(sql0911返回代码2)。创建复合索引和索引是非常重要的。
5。locksize参数使用ALTER TABLE语句来控制如何锁定特定的表在一个持续的基础上。检查syscat.tables的locksize领域,尝试将R(行级锁)在每个表中尽可能的情况下,业务逻辑。
6。根据业务逻辑使用正确的隔离级别(RR、RS、cs和UR)。
7。当执行大量更新时,整个表在更新之前在整个事务中被锁定(使用SQL锁表语句),这只使用锁来阻止其他事务进行这些更新,但是它确实减少了其他用户的数据并发性。

tag:并发控制电脑软件Oracle

相关内容