Posso selezionare i dati inseriti nella stessa transazione non impegnata?


21

Forse questa è una domanda stupida per principianti, ma non riesco a trovare una risposta da nessuna parte. Ovunque leggo ciò Transaction Isolationche risolve la visibilità dei dati all'interno delle transazioni simultanee. La mia preoccupazione è il comportamento all'interno di una singola transazione.

Se inizio una transazione, inserisco alcuni dati, sarò in grado di selezionarli subito dopo - sempre all'interno della stessa transazione, ma non impegnata? In caso affermativo, questo comportamento può essere modificato in modo simile a quello dell'isolamento delle transazioni menzionato in caso di transazioni simultanee?

Per essere precisi, sto prendendo di mira PostgreSQL 9.4.

Risposte:


17

Sì.
Tutto ciò che hai fatto all'interno della stessa transazione è visibile ai comandi successivi all'interno della stessa transazione. Solo non per altre transazioni fino a quando non vengono commesse. Ciò vale per tutti i livelli di isolamento, tranne nei casi in Read uncommittedcui sono possibili "letture sporche" (ma ciò non influisce di per sé sulla domanda).

È implementato con il modello MVCC (Multiversion Concurrency Control) basato sulla TransactionIddeterminazione dell'età e della visibilità per ogni riga della tabella. Ogni nuova versione di riga scritta nella stessa transazione ottiene la stessa xmined è considerata avvenuta "contemporaneamente".

C'è un caso angolare per più CTE (Common Table Expression) nello stesso comando. Si potrebbe pensare che vengano eseguiti in sequenza, ma a meno che un CTE non faccia riferimento all'altro, la loro sequenza è arbitraria. E tutti vedono la stessa istantanea dall'inizio della query.

Esempio:

Esempio avanzato:


3

Proviamo :

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$

Ora proviamo:

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

Funziona ! Come ha affermato Erwin, tutto ciò che è stato fatto in una transazione è visibile all'interno della transazione. L'isolamento è solo tra thread diversi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.