模拟集群下虚谷数据库锁冲突情景
开启三个会话,会话1在节点1上,会话2在节点2上,会话1和会话2用于模拟锁冲突,会话3在节点1上,用于查看锁和会话信息:
会话1:关闭自动提交,并更新id=1的数据
SET auto_commit off;
update ta set name='session1' where id=1;
会话2:关闭自动提交
SET auto_commit off;
会话3:
查看此时每个节点上的会话
select NODEID,SESSION_ID,CURR_TID from sys_all_sessions;
目前是节点1上有两个会话,节点2上一个会话
查看此时每个节点上的持有锁的信息
select obj_name,BIT_AND(LOCK_ID,4294967295),gl.* from sys_all_lowners gl join sys_objects ob on BIT_AND(gl.LOCK_ID,4294967295)=ob.obj_id where gl.lock_type=2;
事务50579持有ta的锁
会话2:
更新id=1的数据,造成锁冲突
update ta set name='session2' where id=1;
会话3:
查询此时的会话信息
select NODEID,SESSION_ID,CURR_TID from sys_all_sessions;
节点2的会话:事务号6196
查询此时持有锁信息
select obj_name,BIT_AND(LOCK_ID,4294967295),gl.* from sys_all_lowners gl join sys_objects ob on BIT_AND(gl.LOCK_ID,4294967295)=ob.obj_id where gl.lock_type=2;
多了一个节点2的事务6196持有ta表的锁
查看此时锁等待信息:
select * from sys_all_lwaiters;
锁类型8对应的锁id就是持有锁的事务号,事务50585被事务50579阻塞,但是从目前的会话事务中没有出现50585的事务号
查询分布式事务50585的根事务
select * from sys_all_trans;
事务50585的R_TRANSID是6196,那就是节点1上的事务50579阻塞了节点2上的事务6196
查看锁等待事务执行的sql:
select * from sys_all_thd_session;
确认是否需要kill 节点1上的事务50579,如果需要执行kill命令
EXEC DBMS_DBA.KILL_TRANS(1,50579);
查看节点2上的事务执行情况:
执行成功
标签:事务,gl,数据库,sys,会话,集群,虚谷,节点,select From: https://blog.csdn.net/kill_cd/article/details/145162598