İşlem İçindeki İşlemler


18

Aşağıdaki komut dosyası çağrılırsa PostgreSQL hangi davranışı gösterir?

BEGIN;
SELECT * FROM foo;
INSERT INTO foo(name) VALUES ('bar');
BEGIN; <- The point of interest
END;

PostgreSQL ikinciyi atar mı BEGINyoksa bir taahhüde dolaylı olarak karar verilir BEGIN ENDmi ve sonunda bloğu ayrı bir işlem olarak çalıştırır mı?

Yanıtlar:


13

İhtiyacınız olan şey "özerk işlem" (oracle tarafından sağlanan bir özellik). Bu noktada bu PostgreSQL'de henüz mümkün değil. Ancak, SAVEPOINT'leri kullanabilirsiniz :

BEGIN;
INSERT ...
SAVEPOINT a;
some error;
ROLLBACK TO SAVEPOINT a;
COMMIT;

Tamamen özerk bir işlem değildir, ancak "her işlemi" doğru şekilde yapmanızı sağlar. Otonom işlemlerden beklediğiniz şeyi elde etmek için kullanabilirsiniz.

Aksi takdirde bu noktada başka makul bir çözüm yoktur.


13

Kendiniz deneyebilirsiniz:

UYARI: zaten devam eden bir işlem var

Yuvalanmış işlemler PostgreSQL'de uygulanmadığından yeni (alt) işlem başlatmaz. ( pl/pgsqlÖrneğin, bu davranışı taklit eden bir işlevde biraz sihir yapabilirsiniz .)

PostgreSQL 11 ile, yeni gerçek saklı yordamlar ve işlem yapabilme yetenekleri iç içe geçmiş işlemleri mümkün kılabilir. Ancak, belgelere göre , durum böyle değil:

Tarafından çağrılan prosedürlerde CALLkomuta yanı sıra anonim kod blokları (içinde DOkomutu), komutları kullanarak işlemleri sona erdirmek için mümkündür COMMITve ROLLBACK. Bu komutlar kullanılarak bir işlem sona erdikten sonra yeni bir işlem otomatik olarak başlatılır, bu nedenle ayrı bir BAŞLAT İŞLEMİ komutu yoktur.


9

PostgreSQL alt işlemleri desteklemez, ancak SAVEPOINTözellik etkin bir şekilde ihtiyaçlarınıza cevap verebilir. Belgelerine alıntı sözlere aracılığıyla PG Gelişmiş erişim katmanında tarafından Vitaly Tomilov GitHub'dan:

PostgreSQL'in iç içe geçmiş işlemler için uygun desteği yoktur, yalnızca işlemler içindeki kayıt noktaları aracılığıyla kısmi geri dönüşleri destekler . İki teknik arasındaki fark, daha fazla açıklandığı gibi, çok büyüktür.

Yuvalanmış işlemler için uygun destek, üst işlem geri alındığında başarılı bir alt işlemin sonucunun geri alınmayacağı anlamına gelir. Ancak PostgreSQL kayıt noktalarında, üst düzey işlemi geri alırsanız, tüm iç kayıt noktalarının sonucu da geri alınır.

Kaydetme noktaları, etkin bir işlemin önceki bir noktasına kısmi geri almalar için kullanılabilir. Örneğin, bir kayıt noktası oluşturmak ve daha sonra, kurulduktan sonra yürütülen tüm komutların etkilerini geri almak için:

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

Yukarıdaki işlem 1 ve 3 değerlerini ekler, ancak 2 değerini girmez. Daha SAVEPOINTfazla bilgi için belgelere bakın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.