一、锁模式对比
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,以达到减少封锁冲突、提升系统并发性能的目的。
- 数据字典锁:用来保护数据字典对象的并发访问,解决DDL并发和DDL/DML并发问题,防止多个事务同时修改同一个对象的字典定义,确保对同一个对象的DDL操作是串行执行的。并防止一个事务在修改字典定义的同时,另外一个事务修改对应表的数据。
- 表锁:表锁用来保护表数据的完整性,防止多个事务同时采用批量方式插入、更新一张表,防止向正在使用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只保护一种对象,而一种闩通常会保护多种对象。