注册
DM数据库锁的探究
技术分享/ 文章详情 /

DM数据库锁的探究

BruceCD 2025/10/17 324 0 0

简述

为了探究DM中的锁的操作,以下内容是通过一些SQL语句执行时,查看会加什么样的锁,来推测具体的锁机制。

查看锁相关的SQL

如何查看当前连接的的session id值:
select SYS_CONTEXT(‘USERENV’,‘SID’);

v$sessions视图展示了当前数据库的所有会话信息,可以使用session id从v$sessions中查到当前连接的具体信息:

select * from v$sessions where sess_id=(select SYS_CONTEXT('USERENV','SID'));

v$trx展示了所有的活动事务信息,其中记录了事务id、事务的状态、事务所属的session id等信息。
可以根据sess_id获取它对应的所有事务信息:

select * from v$trx where sess_id in (select SYS_CONTEXT('USERENV','SID'));

再根据事务id查看属于某个事务的所有锁信息:

select * from v$lock where trx_id=249526;

查询当前连接的所有锁信息:

select * from v$lock where trx_id in (select id from v$trx where sess_id=(select sys_context('USERENV', 'SID')));

查看不同语句执行时对应的锁信息

当使用SYSDBA初次连接到数据库时,还未执行任何查询时,先查询这个连接上所有的锁信息:
图片.png
从图中可以看到它已经有了三个锁,类型都是OBJECT,从TABLE_ID信息中可以查看这些对象是什么:
图片.png
可以看到是SYS、SYSDBA这两个schema对象,以及SYSDUAL这个虚拟表对象。
说明在连接刚初始化的时候,就会给这几个对象加上意向读锁(IS)

但是比较奇怪的是,这个锁并不是每次连接都会出现,大部分情况是不出现的,所以在刚刚连接的时候具体会有哪些锁以及为什么锁的信息不确定,这些还需要再确认下。

当执行第一次查询语句时,再查看当前连接的锁信息,可以发现又多了几条:
图片.png

多出来的第4、5、6行记录分别代表SYSOBJECTS表、TEST_SCHEMA.TEST_TB表、TEST_SCHEMA.SYSOBJECTS同义词的IS锁。

再执行set schema test_schema后,发现锁信息又会多一条记录:
图片.png
这个记录是代表TEST_SCHEMA这个模式的IS锁。但是比较奇怪的是,如果在刚登录时执行这个set schema语句,它会加上两个test_schema对象的IS锁,这个还需要确认下。

再执行一次select * from test_schema.test_tb where id=1;后,锁信息又会多一条记录:
图片.png
这个锁对应的对象是test_tb的聚集索引,因为id是聚集索引列,所以这个查询使用了聚集索引:
图片.png

执行一次update语句后,锁信息会多出来这几条:
图片.png
可以看到这些锁信息对应的是test_tb表的IS、IX锁,test_schema的IX锁,以及一个TID锁。

如果在另外一个会话中也执行这条修改语句,另外一个会话中这个语句会进入锁等待状态,可以看到会多出来2个TID锁:
图片.png
多出来的两个TID锁是等待状态中的会话加上的。

总结

以上是对连接过程、查询语句、更新语句做了一些简单的锁的探索,在探究锁的过程中,通过对系统视图中关于锁的视图和事务的视图进行动态查看,可以获取很多新的信息,了解更细节的加锁和解锁流程,不过有些更深入的信息还需要从原理层面进行深入挖掘。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服