append HINT 的对事务的影响
2011-10-12 16:26 兵临城下_fire 阅读(594) 评论(0) 编辑 收藏 举报使用append hint 可以减少redo信息的产生,可以较快的插入数据,数据迁移。
但是使用了append 后,会阻塞其他session对TABLE 的DML操作。
在append操作完毕之后要尽快提交或者rollback。
下面的测试例子:
准备数据:
create table test as select * from dba_objects;
1)
在session-A 中,执行
insert /*+ append */ into test select * from dba_objects;
2)
再开始一个session,命名为session-B ,执行
SQL> update test set object_id = 300;
session在等待。。
3)
这时回到session-A 的界面,查看等待内容。
SQL> select * from v$lock
2 where type='TM';
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ------ ---------- ---------- ---------- ---------- ---------- ----------
070000004ED1ECA8 070000004ED1ECD0 20 TM 369448 0 6 0 359 1
070000004ED1EBD8 070000004ED1EC00 33 TM 369448 0 0 3 333 0
SQL> select * from dba_waiters;
WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2
--------------- --------------- ------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------ ---------- ----------
33 20 DML Exclusive Row-X (SX) 369448 0
可以看到session 20 是执行append操作的session,拥有的Exclusive Lock,
而session 33 在申请 Row-X ,而Lock级别是不兼容的。故导致session 33 等待。
看到append操作是要获得排他锁,导致对该TABLE 的DML操作无法正常进行。
解决办法是执行append操作的session提交或者回顾session。
提示: DBA_WAITERS的视图,需要运行 $ORACLE_HOME/rdbms/admin/catblock.sql 脚本得到。
当然了,有了DBA_WAITERS的视图,可以通过utllockt.sql 获得lock的层级关系图。