Bir migration
çalışması sırasında kullanılacak olan scriptleri tun ederken, insertler i Append hinti vererek
yapmaya karar verdim. Bir tablo için peşpeşe birkaç tane insert scripti olanlar
da vardı. Append hintinin çalışma
mantığını düşünmeden insertler arasına hintleri vererek geçtim. Sabahın 05’ inde migration çalışmasını
başlattığımda (bir gözü açık bir gözü kapalı durumda J) scriptler patlamaya başlayınca
(tabi bu arada gözlerim açıldı J)
farkettimki Append hinti ile bir
tabloya peşpeşe insert yapıyorsan iki insert arasında mutlaka transactionı
sonlandırmalısın yani commit veya rollback yapmalısın. Appent hinti redo üretimi minumum düzeyde
tuttuğundan dolayı bir sonraki insert ile ilgili yeteri kadar data bilgisi sistemde yer
almamış oluyor. Dolayısıyla (ORA-12838: bir
nesne değiştirildikten sonra paralel olarak okunamaz / değiştirilemez) verdiği bu hatada bir o kadar anlamlı oluyor.
Bir örnekle test
senaryomuzu oluşturalım ;
Test tablomuzu create edelim.
create table test(no number )
Table created
Appent hinti ile insert başlatalım.
insert /*+ append */ into test
select rownum from dba_objects where rownum< 5
4 rows inserted
Şimdi transactionı sonlandırmadan yine
bir insert deneyelim.
insert /*+ append */ into test
select rownum from dba_objects where rownum<5
ora-12838: cannot read/modify an
object after modifying it in parallel
Hatamızı aldık, insertten vazgeçip
select etmeye çalışalım;
select * from test
ora-12838: cannot read/modify an
object after modifying it in parallel
yine hata alıyoruz. Sorunu gidermek ve inserte kaldığımız yerden
devam etmemiz için transactionı sonlandırıp yeni bir transaction ile devam
etmemiz gerekiyor.
commit
Commit complete
insert /*+ append */ into
test select rownum from dba_objects where rownum<5
4 rows inserted
commit
Commit complete
select count(*) from test
COUNT(*)
----------
8
1 row selected
Apend hinti
kullanmıyorsak,tabi tahmin edeceğiniz üzere problem yok istediğiniz kadar sıra
ile insert edebilirsiniz.
drop table test
Table dropped
create table test as
select * from dba_tables where rownum < 5
Table created
insert into test select *
from test
4 rows inserted
insert into test select *
from test
8 rows inserted
select count(*) from test
COUNT(*)
----------
16
1 row selected
commit
Commit complete
drop table test
Table dropped
Hiç yorum yok:
Yorum Gönder