INSERT

2017-05-04 30 views
5

Bir sorun vardır: I Oturum 1 bu tabloya ekleme yapılmasıINSERT

CREATE TABLE T (ID NUMBER, 
       UNIQUE (ID)); 

benzersiz kısıtlama ile bir sütun ile Tablo T sahiptir

INSERT INTO T(id) VALUES(1); 

Oturum 2 bu tablo

aynı değeri birleştirme çalışıyor

O anda Oturum 2 engellenir ve 1. Oturumun işlenmesini veya geri alınmasını bekler. Şimdi bir hata Oturumda 2

ORA-00001 meydana O anda Oturum 1

COMMIT; 

çalıştırmak: benzersiz kısıtlama

orada herhangi seçenekleri mı ihlal Bunu nasıl önleyebilirim?

P.S. Sorun, aynı tablodaki bazı tabloya ve MERGE'ye (ON bölümündeki BENZERSİZ sütunları kullanarak) INSERT olduğudur. Bu INSERT ve MERGE, iki farklı oturumda ayrı olarak çağrılmaktadır. Ve bazen üstte açıklanan durum nedeniyle MERGE düşüyor. Umarım anlaşılır bir şekilde tarif ettim umarım

+0

Bu iki oturumun paralel olarak çalışamaması gibi görünüyorsa, sırayla çalıştırılmalı ve 1. oturumun bitmesini bekleyip daha sonra oturum 2'yi başlatmayı beklemelisiniz, bu bir sorun olur mu? – dood

+0

Kimlik için nasıl bir değer üretildi ve yanlış olan şey ORA-00001' –

+0

@ Arkadiusz Łukasiewicz dediğim gibi - Kimlik sadece bir örnektir. Aslında 3 sütun üzerinde UNIQUE kısıtlaması var. 1. oturumda INSERT 'i yaptım. Aynı değerlerle "MERGE" yi çalıştırıyorum, ancak ON (Açık) bölümünde bu 3 benzersiz sütunu bir araya getiriyorum (böylece normal durumda MERGE, "MATENEBİLİR" bölümüne gider ve başarılı bir şekilde çalışır). Şimdi MERGE, oturum 1'in işlenmesini bekliyor. Yaptıktan sonra, MERGE ON deyimini kontrol etmiyor, sadece INSERT yapmaya çalışıyorum ("DEĞİLDİR" bölümüne git) ve ORA-00001'e düşüyor. – Tatiana

cevap

0

Örneğiniz, phantom reads problem'un bir alt kümesidir. Hayalet okur ve probleminiz sadece ilişkisel veritabanlarının bir özelliğidir. Kleppmann'ın Designing Data-Intensive Applications bölüm 7'sini okumanızı tavsiye ederim.

Seçenekleriniz hafife alınacak değildir:

  1. optimistic locks ile uygulamayı yeniden tasarlayın.
  2. database isolation level'u SERIALIZABLE olarak değiştirin; bu, bireysel işlemleri yavaşlatır ve veritabanının işlemleri paralel olarak yürütme yeteneğini azaltır.

Deneyimlerimden çoğu tasarımcı problemle yaşamayı üçüncü seçeneği seçiyor. İşlevsel olmayan gereksinimlerinize bağlı olarak, uygulamanızı teorik olarak doğrudan ziyade basit tutmak daha iyi olabilir.