yangtingkun
===========================================================
小议自治事务(三)
===========================================================

这两天看了11g的CONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。

描述自治事务与会话的关系。

小议自治事务(一):http://yangtingkun.itpub.net/post/468/467765

小议自治事务(二):http://yangtingkun.itpub.net/post/468/467840


上一篇文章提到了,自治事务更像是在单独的会话中执行,它的事务状态不会影响当前的事务,它也不会看到当前事务没有提交的修改。

那么自治事务是否和推测的一样,是由另一个会话执行的操作呢,下面通过几个例子来验证这一点:

SQL> TRUNCATE TABLE T_AUTO_TRANS;

表被截断。

SQL> CREATE OR REPLACE PROCEDURE P_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
5 DBMS_LOCK.SLEEP(10);
6 COMMIT;
7 END;
8 /

过程已创建。

SQL> SELECT SID FROM V$MYSTAT WHERE ROWNUM = 1;

SID
----------
143

在另外一个会话登陆,检查当前系统中会话数量:

SQL> CONN / AS SYSDBA已连接。
SQL> SET SQLP 'SQL2> '
SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;

SID USERNAME STATUS
---------- ------------------------------ --------
137 ACTIVE
143 YANGTK INACTIVE
145 ACTIVE
147 ACTIVE
149 ACTIVE
154 SYS ACTIVE
156 ACTIVE
157 ACTIVE
160 ACTIVE
161 ACTIVE
162 ACTIVE
163 ACTIVE
164 ACTIVE
165 ACTIVE
166 ACTIVE
167 ACTIVE
168 ACTIVE
169 ACTIVE
170 ACTIVE

已选择19行。

下面执行P_AUTO过程,这个过程会等待10秒的时间:

SQL> EXEC P_AUTO

在第二个会话仍然执行上面的查询:

SQL2> SELECT SID, USERNAME, STATUS FROM V$SESSION;

SID USERNAME STATUS
---------- ------------------------------ --------
143 YANGTK ACTIVE
145 ACTIVE
147 ACTIVE
149 ACTIVE
154 SYS ACTIVE
156 ACTIVE
157 ACTIVE
160 ACTIVE
161 ACTIVE
162 ACTIVE
163 ACTIVE
164 ACTIVE
165 ACTIVE
166 ACTIVE
167 ACTIVE
168 ACTIVE
169 ACTIVE
170 ACTIVE

已选择18行。

查询完成后,会话1的过程才执行完成:


PL/SQL
过程已成功完成。

从这一点上看,没有看到自治事务产生额外的会话。下面再次执行P_AUTO过程,并在过程的执行过程中查询V$LOCK视图,检查产生锁的会话:

SQL2> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME
2 FROM V$LOCK;

SID TY ID1 ID2 LMODE REQUEST CTIME
---------- -- ---------- ---------- ---------- ---------- ----------
165 XR 4 0 1 0 0
165 CF 0 0 2 0 10333
167 PW 1 0 3 0 10320
165 RS 25 1 2 0 10330
166 RT 1 0 6 0 10330
167 MR 1 0 4 0 10324
167 MR 2 0 4 0 10324
167 MR 3 0 4 0 10324
167 MR 5 0 4 0 10324
167 MR 6 0 4 0 10324
167 MR 7 0 4 0 10324
167 MR 8 0 4 0 10324
167 MR 201 0 4 0 10324
164 TS 3 1 3 0 10309
143 TM 57448 0 3 0 3
143 TX 196621 5748 6 0 3

已选择16行。

SQL2> COL OBJECT_NAME FORMAT A30
SQL2> SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
2 FROM DBA_OBJECTS
3 WHERE OBJECT_ID = 57448;

OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -----------
YANGTK T_AUTO_TRANS TABLE

根据上面两个查询可以看到,自治事务仍然和主事务处于同一个事务之中,为了更好的说明问题,在执行P_AUTO过程先,对T_AUTO_TRANS插入一条数据:

SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');

已创建 1 行。

SQL> EXEC P_AUTO

PL/SQL 过程已成功完成。

P_AUTO的执行过程中,再次查询V$LOCK

SQL2> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME
2 FROM V$LOCK;

SID TY ID1 ID2 LMODE REQUEST CTIME
---------- -- ---------- ---------- ---------- ---------- ----------
165 XR 4 0 1 0 0
165 CF 0 0 2 0 10643
167 PW 1 0 3 0 10630
165 RS 25 1 2 0 10640
166 RT 1 0 6 0 10640
167 MR 1 0 4 0 10634
167 MR 2 0 4 0 10634
167 MR 3 0 4 0 10634
167 MR 5 0 4 0 10634
167 MR 6 0 4 0 10634
167 MR 7 0 4 0 10634
167 MR 8 0 4 0 10634
167 MR 201 0 4 0 10634
164 TS 3 1 3 0 10619
143 TM 57448 0 3 0 10
143 TM 57448 0 3 0 7
143 TX 262146 4528 6 0 10
143 TX 589858 5879 6 0 7

已选择18行。

这里可以清楚的看到,SID143的会话同时对应两个事务。因此上文所说的自治事务更像是在单独的会话中执行只是一个比喻,实际上自治事务仍然和主事务处于同一个会话中。

yangtingkun 发表于:2008.08.01 22:38 ::分类: ( ORACLE ) ::阅读:(410次) :: 评论 (2)
re: 小议自治事务(三) [回复]

看了三天,有这样一种感觉,感觉这个东东太灵活,由使用者在自己的控制范围内自由的提交或者回退?

这个东东在我没有百分之二白的把握下,我是不会用的。把大事务分割成小的事务每个分别处理?太可怕了!

kylin 评论于: 2008.08.02 19:25
re: 小议自治事务(三) [回复]

其实事务本身就是用户可以自己决定的东西,自治事务也是一样。

yangtingkun 评论于: 2008.08.04 13:32

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...