为了探究DM中的锁的操作,以下内容是通过一些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初次连接到数据库时,还未执行任何查询时,先查询这个连接上所有的锁信息:
从图中可以看到它已经有了三个锁,类型都是OBJECT,从TABLE_ID信息中可以查看这些对象是什么:
可以看到是SYS、SYSDBA这两个schema对象,以及SYSDUAL这个虚拟表对象。
说明在连接刚初始化的时候,就会给这几个对象加上意向读锁(IS)
但是比较奇怪的是,这个锁并不是每次连接都会出现,大部分情况是不出现的,所以在刚刚连接的时候具体会有哪些锁以及为什么锁的信息不确定,这些还需要再确认下。
当执行第一次查询语句时,再查看当前连接的锁信息,可以发现又多了几条:
多出来的第4、5、6行记录分别代表SYSOBJECTS表、TEST_SCHEMA.TEST_TB表、TEST_SCHEMA.SYSOBJECTS同义词的IS锁。
再执行set schema test_schema后,发现锁信息又会多一条记录:
这个记录是代表TEST_SCHEMA这个模式的IS锁。但是比较奇怪的是,如果在刚登录时执行这个set schema语句,它会加上两个test_schema对象的IS锁,这个还需要确认下。
再执行一次select * from test_schema.test_tb where id=1;后,锁信息又会多一条记录:
这个锁对应的对象是test_tb的聚集索引,因为id是聚集索引列,所以这个查询使用了聚集索引:
执行一次update语句后,锁信息会多出来这几条:
可以看到这些锁信息对应的是test_tb表的IS、IX锁,test_schema的IX锁,以及一个TID锁。
如果在另外一个会话中也执行这条修改语句,另外一个会话中这个语句会进入锁等待状态,可以看到会多出来2个TID锁:
多出来的两个TID锁是等待状态中的会话加上的。
以上是对连接过程、查询语句、更新语句做了一些简单的锁的探索,在探究锁的过程中,通过对系统视图中关于锁的视图和事务的视图进行动态查看,可以获取很多新的信息,了解更细节的加锁和解锁流程,不过有些更深入的信息还需要从原理层面进行深入挖掘。
文章
阅读量
获赞
