2017-12-31 49 views
0

In read committed Isolationsstufe 2 nachfolgende Auswahlabfragen in derselben Transaktion können unterschiedliche Ergebnisse haben, denn es könnte zwischen den zwei Abfragen gleichzeitig Updates ist:Ist es möglich, in CTE-Klauseln in READ COMMITTED Isolationsstufe unterschiedliche Ergebnisse zu haben?

transaction 1: select id from table; 
    => returns [1, 2, 3] 
transaction 2: delete from table where id = 2; 
transaction 1: select id from table; 
    => returns [1, 3] 

Was 1, wenn die Auswahlabfragen in der Transaktion geschieht sind in einem CTE kombiniert? Sagen, dass ich die folgende Dummy-Abfrage haben:

with 
cte_1 as (select id from table), 
cte_2 as (select id from table) 
select (select count(*) from cte_1, select count(*) from cte_2) 

ist es nun auch möglich, dass wir unterschiedliche Ergebnisse, wenn eine gleichzeitige Aktualisierung kommt zwischen der Ausführung von cte_1 und cte_2 bekommen?

Antwort

4

Jede Anweisung wird atomar ausgeführt und zeigt während der Laufzeit eine konsistente Sicht auf die Datenbank. Die „zwei CTEs“ sind eine einzelne Abfrage, damit Abfrage auch keine (stationär) Änderungen vorgenommen sieht während seiner

Der CTE-Abfrage entspricht ausgeführt wird:

select (select count(*) from (select id from table) as cte1), 
     (select count(*) from (select id from table) as cte2) 

Unrelated , aber: Sie könnten nicht bewusst sein, dass select (a,b) ist etwas anderes in Postgres dann select a,b. Der erste gibt eine einzelne Spalte mit einem anonymen Datensatztyp (der zwei Felder enthält) zurück und der zweite gibt zwei Spalten zurück.

+0

Danke, sehr interessant! Auch für die Bemerkung zu "(a, b)" gegenüber "a, b" habe ich es beim Schreiben der Frage nicht wirklich erkannt. –

Verwandte Themen