模拟一个锁
Session1
SQL> create table t1(a int);
SQL> create table t2(a int);
SQL> insert into t1 values(1);
SQL> insert into t2 values(2);
SQL> commit;
SQL> update t1 set a=1000 where a=1;
Session2
SQL> update t2 set a=2000 where a=2;
Session1
SQL> update t2 set a=3000 where a=2;
session1一直处于等待状态:
以上为模拟的锁问题,下面是问题的处理过程
另开一个会话Session3
session3查询执行时间较长的sql:
SQL> SELECT *
2 FROM (SELECT sess_id,
3 sql_text,
4 datediff (ss, last_recv_time, SYSDATE) Y_EXETIME,
5 SF_GET_SESSION_SQL (SESS_ID) fullsql,
6 clnt_ip
7 FROM V$SESSIONS
8 WHERE STATE = ‘ACTIVE’)
9 WHERE Y_EXETIME >= 2;
查询当前数据库实例是否有阻塞
SELECT o.name, l.*
FROM v$lock l, sysobjects o
WHERE l.table_id = o.id AND blocked = 1;
从v$trx视图中查看事物锁的情况
SQL> select ID,MIN_ACTIVE_ID, STATUS from
v$trx;
行号 ID MIN_ACTIVE_ID STATUS
1 13048 13048 LOCK WAIT
2 13049 13048 ACTIVE
3 13050 13048 ACTIVE
已用时间: 3.454(毫秒). 执行号:613.
查询视图
v$lock
SQL> select ADDR,TRX_ID,LMODE,BLOCKED, TABLE_ID,ROW_IDX, TID from v$lock;
从以上查询可以看出,事物13048申请的锁,被事物13049持有。
或通过v$trxwait查看等待情况
SQL> select * from
v$trxwait;
行号 ID WAIT_FOR_ID WAIT_TIME
1 13048 13049 4881923
已用时间: 2.123(毫秒). 执行号:817.
解除事务13048的等待,提交或回滚或终止13049的事务。
SQL> sp_close_session(107353480);
DMSQL 过程已成功完成
查看session1的事务已执行成功
SQL> select * from t2;
行号 A
1 2000
已用时间: 2.764(毫秒). 执行号:408.
更多资讯请上达梦技术社区了解:https://eco.dameng.com