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

Kebuntuan di PostgreSQL saat menjalankan UPDATE

Di PostgreSQL baris akan dikunci saat diperbarui -- sebenarnya, cara ini sebenarnya bekerja adalah bahwa setiap Tuple (versi baris) memiliki bidang sistem yang disebut xmin untuk menunjukkan transaksi mana yang membuat tuple saat ini (dengan menyisipkan atau memperbarui) dan bidang sistem yang disebut xmax untuk menunjukkan transaksi mana yang kedaluwarsa Tuple itu (dengan memperbarui atau menghapus). Saat Anda mengakses data, ia memeriksa setiap tuple untuk menentukan apakah itu terlihat oleh transaksi Anda, dengan memeriksa "snapshot" aktif Anda terhadap nilai-nilai ini.

Jika Anda menjalankan UPDATE dan tuple yang cocok dengan kondisi pencarian Anda memiliki xmin yang akan membuatnya terlihat oleh snapshot Anda dan xmax dari transaksi aktif, tuple itu memblokir, menunggu transaksi itu selesai. Jika transaksi yang pertama memperbarui tuple mundur, transaksi Anda bangun dan memproses baris; jika transaksi pertama dilakukan, transaksi Anda akan aktif dan mengambil tindakan tergantung pada tingkat isolasi transaksi saat ini.

Jelas, kebuntuan adalah hasil dari hal ini terjadi pada baris dalam urutan yang berbeda. Tidak ada kunci tingkat baris dalam RAM yang dapat diperoleh untuk semua baris pada saat yang sama, tetapi jika baris diperbarui dalam urutan yang sama, Anda tidak dapat memiliki penguncian melingkar. Sayangnya, IN(1, 2) suggested yang disarankan sintaks tidak menjamin itu. Sesi yang berbeda mungkin memiliki faktor biaya aktif yang berbeda, tugas "menganalisis" latar belakang dapat mengubah statistik untuk tabel antara pembuatan satu paket dan lainnya, atau mungkin menggunakan seqscan dan dipengaruhi oleh pengoptimalan PostgreSQL yang menyebabkan seqscan baru untuk bergabung dengan yang sudah berlangsung dan "berputar-putar" untuk mengurangi I/O disk.

Jika Anda melakukan pembaruan satu per satu dalam urutan yang sama, dalam kode aplikasi atau menggunakan kursor, maka Anda hanya akan memiliki pemblokiran sederhana, bukan kebuntuan. Namun, secara umum, database relasional rentan terhadap kegagalan serialisasi, dan yang terbaik adalah mengaksesnya melalui kerangka kerja yang akan mengenalinya berdasarkan SQLSTATE dan secara otomatis mencoba kembali seluruh transaksi dari awal. Di PostgreSQL, kegagalan serialisasi akan selalu memiliki SQLSTATE 40001 atau 40P01.

http://www.postgresql.org/docs/current/interactive/mvcc-intro.html




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql:Cara menemukan file pg_hba.conf menggunakan Mac OS X

  2. Dapatkan tabel dan kolom yang memiliki urutan

  3. Bagaimana cara mencadangkan database postgresql dari dalam psql?

  4. Apa yang dimaksud dengan pemindaian tumpukan Bitmap dalam paket kueri?

  5. Cara Memeriksa Versi PostgreSQL Anda