將大的事務切割成小的事務,這樣可以減少undo的需求及鎖的掌控時間
example:
1. 創建一個大表lock_test01,創建遊標並使用它
declare
cursor test_cur is
select * from lock_test01 where name='YAO';
v_test lock_test01%rowtype;
begin
open test_cur;
loop
fetch test_cur into v_test;
insert into lock_test02 values(v_test.name,v_test.pnl);
commit;
exit when test_cur%notfound;
end loop;
end;
/
2.開啟另一個sqlplus, 查看先前鎖的狀況
SQL> SELECT sid,type,id1,id2,lmode,request,block FROM V$LOCK WHERE SID=9;
SQL> SELECT sid,type,id1,id2,lmode,request,block FROM V$LOCK WHERE SID=9
SID TYPE ID1 ID2 LMODE REQUEST BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
9 TX 262144 6921 6 0 0
9 TM 30390 0 3 0 0
note:出現tx及tm事務, 說明正存在undo及insert操作
2.再次查詢
SID TYPE ID1 ID2 LMODE REQUEST BLOCK
---------- ---- ---------- ---------- ---------- ---------- ----------
9 TX 458782 6926 6 0 0
note:儘存在tx事務,之前的tm事務已提交
3.再次查詢
SQL> SELECT sid,type,id1,id2,lmode,request,block FROM V$LOCK WHERE SID=9;
沒有任何資料列被選取
以上, 說明隨著事務的提交,tx及tm鎖迅速的提交,假如直接使用sql語句執行同樣操作:insert into table select * from table方式,tx及tm鎖將持續存在
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/779728/viewspace-1008867/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/779728/viewspace-1008867/
本文通过创建大表并使用游标进行数据处理的方式,演示了如何通过将大事务切割为多个小事务来减少undo需求及锁的持有时间。这种方法有助于提高数据库性能。
829

被折叠的 条评论
为什么被折叠?



