ORA-12838: cannot read/modify an object after modifying it in parallel

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

Be Sociable, Share!

One comment

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


yedi − = 6