10046的trace文件中XCTEND、rlbk、rd_only的含义
Aug292012
今天,正式使用公司的吐槽专区,在吐槽区老大们发起了有关XCTEND、rlbk、rd_only的讨论,简单记录下本人的测试过程,测试使用以下测试表。
SQL> select * from t_test; ID CODE IDENTIFIER ---------- ----- -------------------- 1 01 01-01-0001-000001 2 02 02-01-0001-000001 3 03 03-01-0001-000001 4 04 04-01-0001-000001
对测试表做DML操作,分别测试回滚和提交,并使用10046事件追踪。
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; Session altered. SQL> delete from t_test where id=4; 1 row deleted. SQL> rollback; Rollback complete. SQL> delete from t_test where id=4; 1 row deleted. SQL> commit; Commit complete. SQL> ALTER SESSION SET EVENTS '10046 trace name context off'; Session altered.
查找这个会话的操作系统进程号,找到10046事件生成的trace文件。
SQL> select a.username,a.sid,b.pid,b.spid from v$session a,v$process b where a.paddr=b.addr and a.sid=dbms_support.mysid; USERNAME SID PID SPID ------------------------------ ---------- ---------- ------------ STREAM 143 13 20177 [oracle@dbdream udump]$ ls *20177* ora10g_ora_20177.trc
使用vi编辑器打开trace文件,找到回滚和提交相关部分。
rollback END OF STMT PARSE #1:c=0,e=147,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1314680047145004 XCTEND rlbk=1, rd_only=0 commit END OF STMT PARSE #1:c=0,e=145,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1314680063309564 XCTEND rlbk=0, rd_only=0
以上就是10046事件追踪到回滚和提交的部分信息,其中XCTEND是一个事物结束的标识,rlbk是回滚的标识,1表示rollback,0表示commit,rd_only是只读事物标识,1表示这个事物是只读的,0则表示这个事物是非只读的,举个只读事物的例子,还用上面的测试表,还是那4条记录。
SQL> select * from t_test; ID CODE IDENTIFIER ---------- ----- -------------------- 1 01 01-01-0001-000001 2 02 02-01-0001-000001 3 03 03-01-0001-000001 4 04 04-01-0001-000001
删除一条不存在的记录(比如id=5),然后再分别做回滚和提交操作,用10046事件追踪操作过程。
SQL> ALTER SESSION SET EVENTS '10046 trace name context forever, level 12'; Session altered. SQL> delete from t_test where id=5; 0 rows deleted. SQL> rollback; Rollback complete. SQL> delete from t_test where id=5; 0 rows deleted. SQL> commit; Commit complete. SQL> alter session set events '10046 trace name context off'; Session altered. SQL> select a.username,a.sid,b.pid,b.spid from v$session a,v$process b where a.paddr=b.addr and a.sid=dbms_support.mysid; USERNAME SID PID SPID ------------------------------ ---------- ---------- ------------ STREAM 143 13 22202
打开trace文件,找到rollback和commit部分,会发现rd_only都是1,也就是这两个事物都是只读的事物。
rollback END OF STMT PARSE #2:c=1000,e=148,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1314694329655730 XCTEND rlbk=1, rd_only=1 commit END OF STMT PARSE #2:c=0,e=142,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=1314694342351557 XCTEND rlbk=0, rd_only=1
可见,没有对数据做任何修改的事物是只读事物,反之则为非只读事物。
本文固定链接: https://www.dbdream.com.cn/2012/08/xctend%e3%80%81rlbk%e3%80%81rd_only/ | 信春哥,系统稳,闭眼上线不回滚!
恩,这篇写的挺好的
2012-10-12 11:13@summer
2012-10-12 11:51写的都比较肤浅