Aynı taahhütsüz işleme eklenen verileri seçebilir miyim?


21

Belki bu aptalca bir başlangıç ​​sorusudur, ama hiçbir yerde bir cevap bulamıyorum. Her yerde Transaction Isolation, eşzamanlı işlemlerde verinin görünürlüğünü çözen hakkında okudum . Benim endişem tek bir işlem içindeki davranıştır.

Bir işlem başlatırsam, bazı veriler eklersem, bunları hemen sonra seçebilir miyim - yine de aynı, ancak taahhüt edilmemiş işlem içinde? Evet ise, bu davranış eşzamanlı işlemler durumunda söz konusu İşlem İzolasyonu ile benzer şekilde değiştirilebilir mi?

Spesifik olarak, PostgreSQL 9.4'ü hedefliyorum.

Yanıtlar:


17

Evet.
Aynı işlem içinde yaptığınız her şey, aynı işlem içindeki sonraki komutlar tarafından görülebilir. Taahhüt edilene kadar diğer işlemlere değil. Bu, "kirli okumaların" mümkün olduğu durumlar hariç tüm izolasyon seviyeleri için geçerlidir Read uncommitted(ancak bu, kendi başına sorunuzu etkilemez).

O ile uygulanacağı MVCC modeli (Multiversion Uyumluluk Kontrolü) dayalı TransactionIdher tablo satır için yaş ve görünürlük belirleyen s. Aynı işlemde yazılan her yeni satır sürümü aynı olur xminve "aynı anda" olduğu kabul edilir.

Aynı komutta birden çok CTE (Ortak Tablo İfadesi) için bir köşe durumu vardır . Bunlardan biri sırayla yürütüldüğünü düşünebilir, ancak bir CTE diğerine referansta bulunmadıkça dizileri keyfi olur. Ve hepsi, sorgunun başlangıcından itibaren aynı anlık görüntüyü görüyor.

Örnek:

Gelişmiş örnek:


3

Hadi deneyelim :

CREATE OR REPLACE FUNCTION public.sp_get_user()
 RETURNS json
 LANGUAGE plpgsql
AS $function$BEGIN

INSERT INTO users (name, password) VALUES ('deadeye', 'test');
RETURN row_to_json(row) FROM (SELECT name, password FROM users WHERE name = 'deadeye') row;

END;$function$

Şimdi test edelim:

SELECT sp_get_user();
{"name":"deadeye","password":"test"}

İşe yarıyor ! Erwin'in dediği gibi, bir işlemde yapılan her şey işlemin içinde görülebilir. İzolasyon sadece farklı dişler arasındadır.

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.