如何知道active transaction正在操作的对象
这个问题的研究是一步一步来的。 最开始,客户想知道对于一个已经kill掉的数据库会话,如何评估SMON需要多久才能回滚成功这个会话之前做过的事务,其实也就是这个会话多久才会被完全kill掉。 由于被kill掉的会话所打开的事务已经无法在v$transation视图中查询到,因此需要从数据库基表x$ktuxe中查询。 SELECT ktuxesiz FROM x$ktuxe WHERE ktuxesta != 'INACTIVE'; 可以获得这个会话还在使用的undo block数量,然后过10秒钟,再查询一次,之后两次得到的数值相减,就是10秒内SMON回滚成功的undo block数量,这样再跟当前的ktuxesiz 值比较一下,就可以估算出大概还需要多长时间才能完成整个工作。 Metalink Note:43653.1详细描述了x$ktuxe的各列含义,Eygle的一篇文章也描述了这个方法。 然后,我在自己的机器上实验对这个基表的查询,忽然发现自己的机器上也有一个仍然active的transaction。但是我自己机器上的数据库我并没有做什么DML操作,为什么会有一个active transaction呢?这个transaction还使用了2个undo block。 SQL> SELECT ktuxesiz FROM x$ktuxe WHERE ktuxesta != 'INACTIVE'; KTUXESIZ…