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

Isolasi Transaksi di PostgreSQL

PostgreSQL hadir dengan fitur solid dan teruji waktu yang memungkinkan Anda menentukan dengan tepat apa yang harus terjadi ketika banyak klien mencoba memperbarui data yang sama secara bersamaan. Salah satunya adalah tingkat isolasi transaksi.

Baca terus untuk mempelajari lebih lanjut tentang cara kerja isolasi transaksi di PostgreSQL.

Tingkat Transaksi dan Isolasi

Transaksi adalah cara mendasar untuk mengubah data dalam RDBMS. RDBMS modern memungkinkan lebih dari satu transaksi berjalan secara bersamaan, dan akibatnya datang dengan berbagai alat – beberapa standar, beberapa khusus RDBMS – untuk pengembang aplikasi untuk menentukan bagaimana transaksi mereka harus atau tidak harus berinteraksi dengan transaksi lain.

Tingkat isolasi transaksi dan kunci pesimistis adalah dua alat tersebut. Meskipun ini diperlukan untuk integritas dan kinerja data, sayangnya tidak intuitif untuk dipahami atau digunakan.

Tingkat isolasi transaksi, di PostgreSQL, dapat berupa salah satu dari:

  • Baca Komitmen
  • Baca yang Dapat Diulang
  • Dapat dibuat serial

Setiap transaksi memiliki tingkat isolasi yang disetel ke salah satu dari ini saat dibuat. Level defaultnya adalah “read commited”.

Perhatikan bahwa standar SQL juga mendefinisikan "baca tanpa komitmen", yang tidak didukung di Postgres. Anda harus menggunakan tingkat "komitmen baca" yang terdekat dan lebih tinggi.

Mari kita lihat apa arti level ini.

Baca Berkomitmen

Apa yang terjadi ketika satu transaksi (belum selesai) menyisipkan baris dalam tabel dan transaksi lainnya (juga belum selesai) mencoba membaca semua baris dalam tabel? Jika transaksi kedua dapat melihat baris yang disisipkan oleh transaksi pertama, maka pembacaan tersebut disebut bacaan kotor – karena transaksi pertama dapat dibatalkan dan transaksi kedua akan membaca baris “hantu” yang tidak pernah ada.

sudah dibaca tingkat isolasi menjamin bahwa pembacaan kotor tidak akan pernah terjadi. Ini contohnya:

Seperti yang Anda lihat, transaksi kedua tidak dapat membaca data transaksi pertama yang belum dikomit. Di PostgreSQL, tidak mungkin menurunkan level isolasi ke bawah level ini sehingga pembacaan kotor diperbolehkan.

Baca yang Dapat Diulang

Namun masalah lain adalah pembacaan yang tidak dapat diulang. Ini terjadi ketika sebuah transaksi membaca sebuah baris, dan kemudian membacanya lagi sedikit kemudian tetapi mendapatkan hasil yang berbeda – karena baris tersebut diperbarui di antara transaksi lain. Pembacaan menjadi tidak dapat diulang , seperti yang ditunjukkan dalam contoh ini:

Untuk memperbaiki masalah ini, setel tingkat isolasi transaksi ke "repeatableread". PostgreSQL kemudian akan memastikan bahwa pembacaan kedua (atau apa pun) juga akan mengembalikan hasil yang sama dengan pembacaan pertama. Berikut adalah skenario yang sama pada tingkat isolasi yang ditingkatkan:

Perhatikan bahwa tingkat isolasi ditentukan bersama dengan pernyataan BEGIN. Ini juga memungkinkan untuk menentukan ini pada tingkat koneksi (sebagai parameter koneksi), sebagai parameter konfigurasi (default_transaction_isolation )dan menggunakan pernyataan SET TRANSACTION.

Dapat dibuat serial

Tingkat isolasi berikutnya mengatasi masalah pembaruan yang hilang . Pembaruan yang dilakukan dalam satu transaksi dapat “hilang”, atau ditimpa oleh transaksi lain yang terjadi secara bersamaan, seperti yang ditunjukkan di sini:

Di sini UPDATE transaksi kedua diblokir, karena PostgreSQL mengunci untuk mencegah pembaruan lain hingga transaksi pertama selesai. Namun, perubahan transaksi pertama hilang, karena yang kedua "menimpa" baris.

Jika perilaku semacam ini tidak dapat diterima, Anda dapat meningkatkan level isolasi ke serializable:

Pada level ini, komit transaksi kedua gagal. Tindakan transaksi kedua didasarkan pada fakta yang dianggap tidak valid pada saat akan dilakukan.

Meskipun serialisasi memberikan tingkat keamanan tertinggi, ini juga berarti bahwa aplikasi harus mendeteksi kegagalan komit tersebut dan mencoba lagi seluruh transaksi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. connection.select_value hanya mengembalikan string di postgres dengan permata pg

  2. Dapatkan Ukuran Semua Basis Data di PostgreSQL (psql)

  3. Membuat tabel dalam mode pengguna tunggal di postgres

  4. Bagaimana Atan() Bekerja di PostgreSQL

  5. klien psql dapat menjadi papan catur sekarang ...