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
Teşekkürler 🙂