PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

pelanggaran isolasi transaksi yang jelas di postgresql

Ya dan Tidak - seperti biasa, itu tergantung. Dokumentasi tegas mengatakan bahwa:

Dengan kata lain, SELECT berbeda dari SELECT FOR UPDATE/DELETE/UPDATE.

Anda dapat membuat test case sederhana untuk mengamati perilaku tersebut:

Sesi 1

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> DELETE FROM test;
DELETE 10
test=>

Sekarang login di Sesi lain 2:

test=> START TRANSACTION;
START TRANSACTION
test=> SELECT * FROM test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)


test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;

Setelah perintah terakhir SELECT ... FOR UPDATE sesi 1 "hang" dan sedang menunggu sesuatu ......

Kembali ke sesi 1

test=> insert into test select * from generate_series(1,10);
INSERT 0 10
test=> commit;
COMMIT

Dan sekarang ketika Anda kembali ke sesi 2, Anda akan melihat ini:

test=> SELECT * FROM test WHERE x = 5 FOR UPDATE;
 x
---
(0 rows)


test=> select * from test;
 x
----
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
(10 rows)

Yaitu - SELECT simple sederhana masih tidak melihat perubahan apa pun, sementara SELECT ... FOR UPDATE tidak melihat bahwa baris telah dihapus. Namun tidak melihat baris baru disisipkan oleh sesi 1

Sebenarnya urutan yang Anda lihat adalah:

  • proses A memulai transaksinya
  • proses A menghapus semuanya dari tabel T
  • proses B memulai transaksinya
  • proses B mencoba memilih untuk pembaruan pada satu baris dalam tabel T
  • proses B "hang" dan menunggu hingga sesi A melakukan commit atau rollback
  • proses A mengisi ulang tabel T dari data yang masuk
  • proses A melakukan transaksinya
  • proses B muncul kosong (0 baris- setelah sesi A komit) dan memanggil rollback



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan pencarian PreparedStatement dan Case INsensitive

  2. Membuat dump database untuk tabel dan entri tertentu Postgres

  3. PostgreSQL nextval dan currval dalam kueri yang sama

  4. Penyedia OleDB/ODBC yang bagus untuk PostgreSQL

  5. Perilaku aneh di Postgresql