ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20130125]DML操作出现交集的情况[补充].txt

[20130125]DML操作出现交集的情况[补充].txt

原创 Linux操作系统 作者:lfree 时间:2013-01-25 15:00:06 0 删除 编辑
[20130125]DML操作出现交集的情况[补充].txt

昨天同事问了一个问题,如果DML操作出现交叉的情况下,oracle是如何处理的?
对前面再做一些补充。

http://space.itpub.net/267265/viewspace-753269

我自己还是建立一个测试例子来说明:

1.建立测试环境:
SQL> select * from v$version where rownum<=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

CREATE TABLESPACE aaa DATAFILE
  '/u01/app/oracle11g/oradata/test/aaa01.dbf' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;
--建立表空间mssm主要目的是演示可以重复,保持插入的数据顺序与显示的信息一致。

create table t tablespace aaa as select rownum id1 ,1 id2 ,'aaaa' name from dual connect by level<=3;
alter table t minimize records_per_block;
--这样限制每个数据块3条记录

insert into t     select rownum id1 ,2 id2 ,'bbbb' name from dual connect by level<=3;
insert into t     select rownum id1 ,3 id2 ,'cccc' name from dual connect by level<=3;
commit ;

SQL1> select rowid,a.* from t a;

ROWID                     ID1        ID2 NAME
------------------ ---------- ---------- --------------------------------------------------
AABBqUAALAAAACBAAA          1          1 aaaa
AABBqUAALAAAACBAAB          2          1 aaaa
AABBqUAALAAAACBAAC          3          1 aaaa
AABBqUAALAAAACCAAA          1          2 bbbb
AABBqUAALAAAACCAAB          2          2 bbbb
AABBqUAALAAAACCAAC          3          2 bbbb
AABBqUAALAAAACDAAA          1          3 cccc
AABBqUAALAAAACDAAB          2          3 cccc
AABBqUAALAAAACDAAC          3          3 cccc

9 rows selected.
--注意我表空间是mssm,显示的数据与插入的数据一致。
--从rowid也可以看出数据分布在3个块中。

2.开始测试:
--打开回话1,修改数据不提交:
SQL1> update t set name='3333' where id2=2;

SQL1> select dbms_transaction.local_transaction_id z10 from dual;
Z10
----------
9.14.10234

--打开回话2,修改数据不提交:
SQL2> update t set name='2222' where id1=2;

--这样第2个回话也会修改了id1=2,id2=2的行记录,出现阻塞,回话挂起。
--打开回话3执行如下:

SQL3> select addr, xidusn, xidslot, xidsqn, ubafil, ubablk, ubasqn, ubarec,status, start_time, start_scnb, start_scnw, ses_addr from v$transaction;

ADDR                 XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC STATUS           START_TIME           START_SCNB START_SCNW SES_ADDR
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ---------- ----------------
00000000B5634500          9         14      10234          3       3153       5252         21 ACTIVE           01/25/13 14:50:49    3221937355          0 00000000B51B7E98
00000000BF9BC378         11         31       1761          3       4635       1095         42 ACTIVE           01/25/13 14:52:25    3221937397          0 00000000B616F910

--从显示可以看出,第1行信息与回话1的信息相符合。第2行自然与第2个回话有关。
--这个时候如果在第3个回话执行update t set name='xxxx' where id1=2 and id2=3;可行吗?会挂起吗?
--从前面的演示可以推出应该没有问题,因为在id1=2,id2=2时出现阻塞,但是这个时候id1=2 and id2=3还没有操作。

SQL3> update t set name='xxxx' where id1=2 and id2=3;
1 row updated.

但是如果执行update t set name='xxxx' where id1=2 and id2=1;应该会出现阻塞情况。

SQL3> update t set name='xxxx' where id1=2 and id2=1;

作为前面的补充,更好的理解这些问题。







来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-753333/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969649