达梦数据库锁介绍
锁模式
- 共享锁
共享锁(Share Lock,简称 S 锁)用于读操作,防止其他事务修改正在访问的对象。这种封锁模式允许多个事务同时并发读取相同的资源,但是不允许任何事务修改这个资源。 - 排他锁
排他锁(Exclusive Lock,简称 X 锁)用于写操作,以独占的方式访问对象,不允许任何其他事务访问被封锁对象;防止多个事务同时修改相同的数据,避免引发数据错误;防止访问一个正在被修改的对象,避免引发数据不一致。一般在修改对象定义时使用。 - 意向锁
意向锁(Intent Lock)用于读取或修改被访问对象数据时使用,多个事务可以同时对相同对象上意向锁,DM 支持两种意向锁:
- 意向共享锁(Intent Share Lock,简称 IS 锁):一般在只读访问对象时使用;
- 意向排他锁(Intent Exclusive Lock,简称 IX 锁):一般在修改对象数据时使用。
锁粒度
按照封锁对象的不同,锁可以分为 TID 锁和对象锁。
- TID 锁
TID 锁以事务号为封锁对象,为每个活动事务生成一把 TID 锁,代替了其他数据库行锁的功能,防止多个事务同时修改同一行记录。DM 实现的是行级多版本,每一行记录隐含一个 TID 字段,用于事务可见性判断。 - 对象锁
对象锁是 DM 新引入的一种锁,通过统一的对象 ID 进行封锁,将对数据字典的封锁和表锁合并为对象锁,以达到减少封锁冲突、提升系统并发性能的目的。我们先看一下通常数
据字典锁和表锁各自应承担的功能:
-
数据字典锁:用来保护数据字典对象的并发访问,解决 DDL 并发和 DDL/DML 并发问题,防止多个事务同时修改同一个对象的字典定义,确保对同一个对象的 DDL操作是串行执行的。并防止一个事务在修改字典定义的同时,另外一个事务修改对应表的数据。
-
表锁:表锁用来保护表数据的完整性,防止多个事务同时采用批量方式插入、更新一张表,防止向正在使用 FAST LOADER 工具装载数据的表中插入数据等,保证这些优化后数据操作的正确性。此外,表锁还有一个作用,避免对存在未提交修改的表执行 ALTER TABLE、TRUNCATE TABLE 操作。
TID锁查看
1、查看表中 TID 字段
说明:TRXID为事务ID。
2、查看动态视图中TID锁
3、查看表中TRXID字段内容
如何利用TID锁控制数据库版本
1、每一条物理记录中包含了两个字段:TID和 RPTR。TID 保存修改记录的事务号,RPTR 保存回滚段中上一个版本回滚记录的物理地址。
2、回滚记录与物理记录一样,增加了两个字段:TID 和 RPTR。TID 保存回滚记录对应的事务号,RPTR 保存回滚段中上一个版本回滚记录的物理地址。
a、如果NEXT_TID >TRXID 表示当前事务在数据修改数据的事务之后,结合活动事务动态视图,如果TRXID在活动事务中,表示事务未递交则数据在其它事务不可见。
b、如果NEXT_TID<TRXID表示当前事务在数据修改数据的事务之前,则数据不能被当前事务可见。
c、如果NEXT_TID=TRXID表示当前事务为修改数据的事务