Dapatkah saya memilih data yang dimasukkan dalam transaksi yang tidak dikomit yang sama?

21

Mungkin ini adalah pertanyaan pemula yang bodoh, tetapi saya tidak dapat menemukan jawaban di mana pun. Di mana-mana saya membaca tentang Transaction Isolationyang memecahkan visibilitas data dalam transaksi bersamaan. Kekhawatiran saya adalah perilaku dalam satu transaksi.

Jika saya memulai transaksi, masukkan beberapa data, apakah saya akan dapat memilihnya setelah itu - masih dalam transaksi yang sama, namun tidak berkomitmen? Jika ya, bisakah perilaku ini diubah dengan cara yang sama seperti Isolasi Transaksi yang disebutkan dalam kasus transaksi bersamaan?

Untuk lebih spesifik, saya menargetkan PostgreSQL 9.4.

Nomor empat
sumber

Jawaban:

17

Iya nih.
Segala sesuatu yang Anda lakukan di dalam transaksi yang sama terlihat kemudian perintah di dalam transaksi yang sama. Hanya saja tidak untuk transaksi lain sampai dilakukan. Ini berlaku untuk semua level isolasi kecuali Read uncommittedjika "pembacaan kotor" dimungkinkan (tetapi itu tidak memengaruhi pertanyaan Anda sendiri).

Diimplementasikan dengan model MVCC (Multiversion Concurrency Control) berdasarkan pada TransactionIdmenentukan usia dan visibilitas untuk setiap baris tabel. Setiap versi baris baru yang ditulis dalam transaksi yang sama akan sama xmindan dianggap telah terjadi "pada saat yang sama".

Ada kasus sudut untuk beberapa CTE (Common Table Expression) dalam perintah yang sama. Orang mungkin berpikir itu dieksekusi berurutan, tetapi kecuali satu CTE referensi yang lain urutan mereka sewenang-wenang. Dan semuanya melihat snapshot yang sama dari awal permintaan.

Contoh:

Contoh lanjutan:

Erwin Brandstetter
sumber
3

Mari mencoba :

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$

Sekarang, mari kita coba:

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

Berhasil ! Seperti yang dikatakan Erwin, semua yang dilakukan dalam suatu transaksi terlihat di dalam transaksi. Isolasi hanya di antara berbagai utas.

DeadEye
sumber