V$TRANSACTION lists the active transactions in the system. When the transaction is complete, (either COMMIT or ROLLBACK), the entry should go away.
V
S
E
S
S
I
O
N
t
a
d
d
r
,
p
a
d
d
r
分
别
对
应
v
SESSION taddr ,paddr 分别对应 v
SESSIONtaddr,paddr分别对应vtransaction addr,V
P
R
O
C
E
S
S
a
d
d
r
v
PROCESS addr v
PROCESSaddrvtransaction的used_ublk可以查看进度
used_ublk 在做回滚时有多少块在使用
used_now 现在有多少块在使用
used_later 在60秒后有多少块使用
示例一:
session A:
创建测试表,并更新
SQL> create table scott.test as select * from dba_objects;
SQL> update test set OBJECT_ID=OBJECT_ID+1;
已更新50343行。
session B:
查询v
t
r
a
n
s
a
c
t
i
o
n
S
Q
L
>
s
e
l
e
c
t
S
T
A
R
T
T
I
M
E
,
S
T
A
R
T
S
C
N
B
,
U
S
E
D
U
B
L
K
,
U
S
E
D
U
R
E
C
,
L
O
G
I
O
,
P
H
Y
I
O
f
r
o
m
v
transaction SQL> select START_TIME,START_SCNB,USED_UBLK,USED_UREC,LOG_IO,PHY_IO from v
transactionSQL>selectSTARTTIME,STARTSCNB,USEDUBLK,USEDUREC,LOGIO,PHYIOfromvtransaction;
START_TIME START_SCNB USED_UBLK USED_UREC LOG_IO PHY_IO
05/05/08 15:13:53 708551 698 54422 185843 0
session A:
再更新一些记录
SQL> update test set wner=‘AAA’;
已更新50343行。
session B:
再查询v$transaction
SQL> /
START_TIME START_SCNB USED_UBLK USED_UREC LOG_IO PHY_IO
05/05/08 15:13:53 708551 1269 96902 353324 1
列出这几列的含义,自己可以对比一下:
start_time --> start_time ?
start_scnb --> 开始的scn
used_ublk --> 占用的undo block
used_urec --> undo 记录的行数
log_io --> 逻辑io 注意并非Consistent gets,有专门一列:CR_GET
phy_io --> 物理io
如果想要得到session那就可以再加上查询SES_ADDR列:
SES_ADDR User session object address -->对应v
s
e
s
s
i
o
n
的
s
a
d
d
r
列
,
再
进
一
步
自
然
可
以
找
到
正
在
执
行
的
s
q
l
.
如
果
想
要
对
应
回
滚
段
则
:
X
I
D
U
S
N
U
n
d
o
s
e
g
m
e
n
t
n
u
m
b
e
r
−
−
>
使
用
的
回
滚
段
i
d
,
可
以
和
v
session 的saddr列,再进一步自然可以找到正在执行的sql. 如果想要对应回滚段则: XIDUSN Undo segment number -->使用的回滚段id,可以和v
session的saddr列,再进一步自然可以找到正在执行的sql.如果想要对应回滚段则:XIDUSNUndosegmentnumber−−>使用的回滚段id,可以和vrollstat对应
想更深入了解一个transaction,有了sql就能更深入了。
示例二:
用如下SQL查询到正在运行的事务,如其used_urec字段不断增加,说明该事物正在继续,如果该字段不断下降,说明该事物正在回滚。
SQL> SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk
v
s
e
s
s
i
o
n
a
,
v
session a, v
sessiona,vtransaction b
WHERE a.saddr = b.ses_addr;
SID USERNAME XIDUSN USED_UREC USED_UBLKITPUB
118 CCP 102 12 1
SQL> SELECT a.sid, a.username, b.xidusn, b.used_urec, b.used_ublk
FROM v
s
e
s
s
i
o
n
a
,
v
session a, v
sessiona,vtransaction b
WHERE a.saddr = b.ses_addr;
SID USERNAME XIDUSN USED_UREC USED_UBLK
596 GCC 87 2 1