虚谷数据库锁等待处理方法
模拟单机下虚谷数据库锁冲突情景
开启三个会话,会话1和会话2都设置非自动提交用于模拟锁冲突,会话3登录到系统库system,用于查询会话和锁情况:
会话1:
SET auto_commit off;
会话2:
SET auto_commit off;
会话1开启事务1:更新id=1的数据
update ta set name='o' where id =1;
会话3:
查看这个时候的会话和锁情况:
select SESSION_ID,CURR_TID from sys_sessions;
现在有3个会话连接:事务号分别为198851、null(会话2没有开启事务)、198858

再查看持有锁的事务
通过持有锁的系统视图sys_lowners和数据库对象视图sys_objects查询持有锁的事务和表对象,表id通过BIT_AND(LOCK_ID,4294967295)计算得到,sys_lowners .lock_type=2表示查询的是对象锁,锁等待的对象是table_id,相关表的字段信息可以查看:系统全局锁-sys_glocks | 文档中心
select obj_name,BIT_AND(LOCK_ID,4294967295),gl.* from sys_lowners gl join sys_objects ob on BIT_AND(gl.LOCK_ID,4294967295)=ob.obj_id where gl.lock_type=2;
目前持有锁的事务是:198851

会话2开启事务并更新id=1的数据,造成锁等待
update ta set name='h' where id =1;

会话3:
查询此时的会话信息和锁信息:
select SESSION_ID,CURR_TID from sys_sessions;
目前三个会话的事务号分别是:198851、198860、198861

再次查看持有锁的事务号
select obj_name,BIT_AND(LOCK_ID,4294967295),gl.* from sys_lowners gl join sys_objects ob on BIT_AND(gl.LOCK_ID,4294967295)=ob.obj_id where gl.lock_type=2;
持有锁的事务:198851、198860

查看锁等待的事务
锁类型LOCK_TYPE=8,表示LOCK_ID=持有锁的事务id,详细的每种锁类型对应的LOCK_ID可以参考:全局锁-sys_all_glocks | 文档中心
select * from sys_lwaiters;
锁等待信息为:事务198860被198851阻塞

查看被阻塞的事务和sql
select * from sys_thd_session;
事务198860在执行update ta set name='h' where id =1;时被阻塞,需要判断持有锁的事务198851是否可以kill,如果不行就只能等待事务执行完

kill事务:虚谷数据库支持kill session(杀会话)和kill trans(杀事务),一般采用kill trans的方式
EXEC DBMS_DBA.KILL_TRANS(1,198851);

查看会话2的事务执行情况:阻塞的事务198851被kill后,事务198860成功执行

锁等待事务也没有了

更多推荐
所有评论(0)