LOCK_DICT_OPT 0 静态 DICT封锁优化,事务提交或回滚时,不真正释放表上IS锁和IX锁对象。
0:不优化; 1:单机环境优化, DSC集群环境不优化; 2:单机、集群环境都优化
存在LOCK_DICT_OPT初始化后为2的情况,导致数据库的IS锁和IX锁不释放
刚启动数据库时
select * from v$lock
select t.object_name from all_objects t,v$lock l where t.object_id = l.table_id
V$LOCK中字段IGN_FLAG表示在LOCK_DICT_OPT开启时查看锁的使用状况
所以当LOCK_DICT_OPT开启时可以通过以下SQL去查询正在使用的锁的SESS_ID和锁的类型,被上锁的表
select s.SESS_ID,L.LMODE,a.OBJECT_NAME from v
l
o
c
k
l
,
v
lock l,v
lockl,vsessions s,v$trx t,ALL_OBJECTS a where l.IGN_FLAG = 0 and l.TRX_ID=t.ID and t.sess_id=s.sess_id and a.OBJECT_ID = l.TABLE_ID;
模拟:
手动加IS锁
lock table TABLE_1 in intent share mode nowait;
SQL执行后查询到的信息
可以根据实际情况,考虑是否杀掉这个SESSION
添加列失败
在刚刚的窗口操作其他SQL后查询v$SESSIONS
可以看出 STATE的状态时IDLE SQL也为select
但确实是这个session导致的
sp_close_session(140099484934248)
添加列成功。
LOCK_DICT_OPT=0时
刚启动集群V$LOCK中没有内容
此时若有内容,即为有正在使用的锁,正常处理即可。