达梦数据库锁机制

目录

一、锁概述

二、锁模式

三、达梦锁粒度

四、锁管理机制与步骤

五、查看达梦锁,相关系统表

六、锁相关操作演示

意向共享锁上锁:

意向排他锁上锁:

事务提交,释放锁资源:

检查锁排斥规则:

TID锁机制:


一、锁概述

        锁是一种防止相互数据破坏的机制。当在访问共享数据的事务之间,错误的更新数据或更改数据结构,将引起数据一致性被破坏。锁在维护数据库并发性和一致性方面起着至关重要的作用。

        DM 数据库支持多用户并发访问、修改数据,有可能出现多个事务同时访问、修改相同
数据的情况。若对并发操作不加控制,就可能会访问到不正确的数据,破坏数据的一致性和
正确性。
        封锁机制是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据库对象进
行操作前,需要先对其封锁。封锁后事务就对该数据库对象有了一定的控制,在该事务释放
锁之前,其他的事务不能对此数据库对象进行相应操作。

二、锁模式

        锁模式指定并发用户如何访问锁定资源。DM 数据库使用四种不同的锁模式:共享锁、
排他锁、意向共享锁和意向排他锁。         
        
        
1. 共享锁
        共享锁(Share Lock ,简称 S 锁)用于读操作,防止其他事务修改正在访问的对象。
这种封锁模式允许多个事务同时并发读取相同的资源,但是不允许任何事务修改这个资源。
2. 排他锁
        排他锁(Exclusive Lock ,简称 X 锁)用于写操作,以独占的方式访问对象,不允许任
何其他事务访问被封锁对象;防止多个事务同时修改相同的数据,避免引发数据错误;防止
访问一个正在被修改的对象,避免引发数据不一致。一般在修改对象定义时使用。
3. 意向锁
        意向锁(Intent Lock )用于读取或修改被访问对象数据时使用,多个事务可以同时对
相同对象上意向锁, DM 支持两种意向锁:
1) 意向共享锁( Intent Share Lock ,简称 IS 锁):一般在只读访问对象时使用;
2) 意向排他锁( Intent Exclusive Lock ,简称 IX 锁):一般在修改对象数据时使用。
        四种锁模式的相容矩阵如下表所示,其中“Y” 表示相容; “N” 表示不相容。
如表中第二行 第二列为“Y” ,表示如果某个事务已经加了 IS 锁时,其他事务还可以继续添加 IS 锁,第二行 第五列为“N” ,表示如果某个事务已经加了 IS 锁时,其他事务不能添加 X 锁。

三、达梦锁粒度

按照封锁对象的不同,达梦的锁可以分为 TID 锁和对象锁。
1. TID

TID锁是达梦数据库中用于控制并发访问的一种锁机制。它以事务号作为锁的对象,为每个活动事务生成一把TID锁,用于防止多个事务同时修改同一行记录。与其他数据库的行锁不同,TID锁代替了行锁的功能。

举个例子来说明,假设有两个事务T1和T2同时想要修改同一行数据。在达梦数据库中,每个事务都有一个唯一的事务号(TID)。当T1开始执行修改操作时,它会把自己的事务号(TID1)设置到该行数据的TID字段中,相当于为该行数据隐式地加上了一把TID锁。此时,T1可以安全地修改这一行数据。而当T2也开始执行修改操作时,它发现该行数据的TID字段已经被T1占用了。此时,T2会生成一个新的TID锁,其锁对象为TID1(T1的事务号),而不是事务T2本身。这样,T2就知道该行数据正在被其他事务修改,并且需要等待T1完成修改后才能执行自己的修改操作。

TID锁的一个优点是它避免了大量行锁对系统资源的消耗。在执行INSERT、DELETE、UPDATE操作时,不再需要额外的行锁,而是通过设置事务号到TID字段来隐式地加上TID锁。只有多个事务同时修改同一行记录时,才会产生新的TID锁。

此外,达梦数据库还采用了多版本并发控制(MVCC)的方式。每一行记录都隐含一个TID字段,用于事务可见性判断。这意味着SELECT操作已经消除了行锁的概念,读操作不会被写操作阻塞。

2. 对象锁
对象锁是 DM 新引入的一种锁,通过统一的对象 ID 进行封锁,将对数据字典的封锁和
表锁合并为对象锁,以达到减少封锁冲突、提升系统并发性能的目的。

四、锁管理机制与步骤

锁的管理这时候就需要引入锁管理中心的这个概念了,锁管理中心用于保锁的正确获取、释放和管理。下面举了一个例子,锁管理中心所进行的工作流程:

这个流程图描述了锁管理中心的工作过程,包括以下主要步骤:

  1. 事务/线程发起锁申请请求。
  2. 锁管理中心接收锁申请,并检查数据对象的锁状态。
  3. 根据锁类型兼容性判断,如果兼容,则分配共享锁;如果不兼容,则根据策略处理,可能导致等待或回滚等操作。
  4. 分配独占锁,并记录锁的时间戳。
  5. 事务持有锁进行操作。
  6. 定期检测锁超时,如果锁超时,则强制回收锁资源。
  7. 事务完成操作后,释放锁资源。
  8. 锁管理中心定期进行死锁检测,如果发现死锁,则根据策略进行处理,可能导致回滚事务等操作。
  9. 锁管理中心负责维护锁表和统计信息。

当然,达梦锁管理中心实现的比较复杂,实际的锁管理中心可能会涉及更复杂的算法和策略来处理锁分配、冲突检测、超时处理、死锁检测和维护锁表等任务。这里只是大致介绍锁管理中心的工作流程。

五、查看达梦锁,相关系统表

        DM 数据库专门提供了一个 V$LOCK 动态视 图。通过该视图,用户可以查看到系统当前所有锁的详细信息,如锁的内存地址、所属事务 ID、锁类型、锁模式等。用户可以通过执行如下语句查看锁信息。
SELECT * FROM V$LOCK;

可以看到有很多列,

addr: 该列表示锁所存储的内存地址

irx_id: 锁所属的事务 ID

ltype:锁类型,对象锁,tid锁

lmode:锁的模式,is,ix,s,x四种模式

BLOCKED :锁是否处于上锁等待状态,0 表示已上锁成功,1 表示处于上锁等待状态

table_id:表示表对象或字典对象的 ID,对于 TID 锁,表示封锁记录对应的表 ID

ROW_IDX :改列为 TID 锁封锁记录的行信息
tid:TID 锁对象事务 ID

六、锁相关操作演示

意向共享锁上锁:

查询t2表中的数据,并查看锁相关信息

select * from t2 ;

SELECT * FROM V$LOCK where table_id =1016;

如图所示,可以看到,对这张表添加了一个对象锁,并且锁的模式是意向共享锁

意向排他锁上锁:

往表中插入一条数据

insert into t2 values (1,1);
SELECT * FROM V$LOCK where table_id =1016;

已经有一个is意向共享锁,可以看到insert语句,加上的锁是ix 意向排他锁,并且和is锁并不冲突,而且也把trx_id该事务id加入到tid中

事务提交,释放锁资源:

这时,我们尝试继续对表进行插入和修改操作:

insert into t2 values (3,3);
SELECT * FROM V$LOCK where table_id =1016;

事务未提交,对表对象加的锁,并未解锁,所以在同一个事务当中,并不需要重复加锁

我们提交数据再进行插入:

commit;
insert into t2 values (2,2);
insert into t2 values (3,3);
SELECT * FROM V$LOCK where table_id =1016;

可以看见,该表在上一个事务提交后,锁资源释放,现在该事务155327重新加上ix锁

检查锁排斥规则:

这个时候对表进行加x锁,排他锁,查看锁状态

alter table "SYSDBA"."T2" add primary key("ID2");

可以看到,当表中有ix锁,再进行加排它锁,分配锁的时候,加锁超时,导致错误

TID锁机制:

开两个查询框,执行相同的修改操作,对同一行进行修改:


update t2 set id2 =10 where id2=1;
SELECT * FROM V$LOCK where table_id =1016;

事务155386对表进行修改操作

开一个新查询框,执行同样的操作:

update t2 set id2 =10 where id2=1;
SELECT * FROM V$LOCK where table_id =1016;

可以看到这个修改为执行,卡在加锁前了,未添加锁资源

如图可以看到,在执行update操作后,添加了一个ix锁,并未冲突,但对同一行进行修改,则会出发tid锁,可以看见对表1016又添加了一个TID锁的排他锁,但它的blocked列值为1,代表着为上锁成功,处于上锁等待状态,生成一个新的TID锁,其锁对象为155386(上一个事务事务1的事务号),这样,事务2就知道该行数据正在被其他事务修改,并且需要等待事务1完成修改后才能执行自己的修改操作。

提交事务1

查看事务2的锁情况:

可以看到事务155386已经提交后,相关锁资源释放,TID锁blocked列值为0,上锁成功

七、达梦数据库官方网址以及产品

达梦技术社区

达梦在线服务平台

达梦数据官网

达梦咨询热线

400-991-6599

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值