DM和Oracle锁对比和分析

一、锁模式对比

DM和Oracle都是典型的关系型数据库系统,严格遵守数据库的ACID特性。在事务隔离级别,默认都是读提交(Read Committed)。

在事务管理方面,两个数据库系统都有一套自己的锁管理机制。以下所有的测试,以DM8和Oracle11.2版本数据库为例,不同数据库版本,在事务的锁管理方面会有一些差异。

1.1 DM和Oracle数据库锁模式说明

DM和Oracle数据库锁模式说明

数据库

锁模式

锁模式说明

备注

DM

S

共享锁,Share Lock,简称S锁。用于读操作,防止其他事务修改正在访问的对象。

相关数据字典

V$LOCK  

V$SESSIONS

V$DEADLOCK_HISTORY

X

排他锁,Exclusive Lock,简称X锁。用于写操作,以独占的方式访问对象,不允许任何其他事务访问被封锁对象;

IS

意向共享锁,Intent Share Lock,简称IS锁。在只读访问对象时使用;

IX

意向排他锁,Intent Exclusive Lock,简称IX锁。在修改对象数据时使用。

Oracle

0

不存在锁

相关数据字典V$LOCKED_OBJECT  V$LOCK  

V$SESSION

1

空锁,不与其他任何锁冲突。相关SQL操作是:select

2

row-S(SS,行级共享锁,其它session只能查询这些数据行。SQL操作有select for update、lock for update、lock row share)。相关SQL操作是:lock table in row share mode,lock table in update mode

3

row-X(SX,行级排它锁,在提交前不允许做DML操作。SQL操作有insert、update、delete、lock row share)。相关SQL操作是:insert,delete,update,select ... for update,lock table in row exlusive mode。

4

share(S,表级共享锁。SQL操作有create index,lock table in share)。

5

S/Row-X(SSX,共享行级排它锁。SQL操作有lock table in share row exclusive mode)

6

exclusive(X,表级独占锁(排它锁)。SQL操作有alter table、drop table、drop index、truncate table、lock table in exclusive mode等DDL操作)

从上表可以看出DM通过字母定义每个锁模式的含义,Oracle通过数字定义每个锁模式的含义,Oracle的锁模式定义比DM更复杂一些。DM通过V$LOCK视图中LMODE字段查看事务对象的锁级别,Oracle通过V$LOCKED_OBJECT视图中LOCKED_MODE字段查看事务对象的锁级别。

1.2 DM和Oracle数据库锁相关数据字典

(1)DM的V$LOCK数据字典字段信息如下:

ADDR:表示锁的内存地址;

TRX_ID:表示锁所属的事务ID;

LTYPE:表示锁的类型,可能是OBJECT(对象锁)或者TID(TID锁);

LMODE:表示锁的模式,可能的取值有S(共享锁)、X(排他锁)、IS(意向共享锁)、IX(意向排他锁);

BLOCKED:表示锁是否处于上锁等待状态,0表示已上锁成功,1表示处于上锁等待状态;TABLE_ID:对于对象锁,表示表对象或字典对象的ID,对于TID锁,表示封锁记录对应的表ID;

ROW_IDX:为TID锁封锁记录的行信息;

TID:为TID锁对象事务ID。

IGN_FLAG:锁对象的IGNORABLE标记,INI参数LOCK_DICT_OPT开启时有效。

取值0,表示锁正在使用中取值1,表示事务TRX1已经提交,但是锁资源未释放,TRX1重新封锁时可以直接使用其他事务TRX2封锁相同对象时可以忽略此IGN_FLAG=1的锁LOCK1,但是要设置LOCK1->IGN_FLAG=2,表示该锁TRX1不能直接使用,要释放后重新封锁。

HLCK_EP:关联对象HLCK所属节点号。DSC集群环境标识创建HLCK对象的节点号,默认为255,单机无效。

(2)Oracle的V$LOCKED_OBJECT视图字段信息如下:

XIDUSN:回滚段号

XIDSLOT:槽号

XIDSQN:序列号

OBJECT_ID:被锁对象ID

SESSION_ID:持有锁的sessionID

ORACLE_USERNAME:持有锁的Oracle用户名

OS_USER_NAME:持有锁的操作系统用户名

PROCESS:操作系统进程号

LOCKED_MODE:锁模式。

二、锁粒度对比

2.1 DM锁粒度

DM按照封锁对象的不同,锁可以分为TID锁和对象锁。通过V$LOCK视图中LTYPE字段查看事务锁粒度。

(1)TID锁

TID锁以事务号为封锁对象,标识为TID,为每个活动事务生成一把TID锁,代替了其他数据库行锁的功能,防止多个事务同时修改同一行记录。

(2)对象锁

对象锁通过统一的对象ID进行封锁,将对数据字典的封锁和表锁合并为对象锁,标识为OBJECT,以达到减少封锁冲突、提升系统并发性能的目的。

  1. 数据字典锁:用来保护数据字典对象的并发访问,解决DDL并发和DDL/DML并发问题,防止多个事务同时修改同一个对象的字典定义,确保对同一个对象的DDL操作是串行执行的。并防止一个事务在修改字典定义的同时,另外一个事务修改对应表的数据。
  2. 表锁:表锁用来保护表数据的完整性,防止多个事务同时采用批量方式插入、更新一张表,防止向正在使用FAST LOADER工具装载数据的表中插入数据等,保证这些优化后数据操作的正确性。此外,表锁还有一个作用,避免对存在未提交修改的表执行ALTER TABLE、TRUNCATE TABLE操作。

2.2 Oracle锁粒度

2.2.1 Oracle锁分类

根据保护的对象不同,Oracle数据库锁可以分为以下几大类:    

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

(2)DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;    

(3)内部锁和闩(internal locks and latches),保护数据库的内部结构。

2.2.2 DML锁

DML锁主要包括TM锁和TX锁,其中TM锁称为意向锁或表级锁,TX锁称为行级锁或事务锁。

(1)TM锁(也叫意向锁/表级锁):

(2)TX锁:

2.2.3 DDL锁

(1)排他DDL锁  --即6号的TM锁(Exclusive DDL Locks)

(2)共享DDL锁(Share DDL Locks)

(3)可中断解析锁(Breakable Parse Locks)

2.2.4 内部闩锁机制

(1)Latches:可译作闩或者栓,这是一种非常低级别的序列化结构,用于协调并发会话对于共享数据结构、文件等的访问。

(2)Mutex:(Mutual exclusion object):可以译作互斥体,这种结构很类似于闩,区别在于一种mutex只保护一种对象,而一种闩通常会保护多种对象。

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值