Lock:transactionid - Amazon Aurora

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Lock:transactionid

Peristiwa Lock:transactionid terjadi saat transaksi sedang menunggu kunci tingkat baris.

Versi mesin yang didukung

Informasi peristiwa tunggu ini didukung untuk semua versi Aurora PostgreSQL.

Konteks

Peristiwa Lock:transactionid terjadi saat transaksi mencoba memperoleh kunci tingkat baris yang telah diberikan untuk transaksi yang sedang berlangsung pada saat bersamaan. Sesi yang menunjukkan peristiwa tunggu Lock:transactionid diblokir karena kunci ini. Setelah transaksi pemblokiran berakhir dengan pernyataan COMMIT atau ROLLBACK, transaksi yang diblokir dapat dilanjutkan.

Semantik kontrol bersamaan multiversi dari Aurora PostgreSQL menjamin bahwa pembaca tidak memblokir penulis dan penulis tidak memblokir pembaca. Agar pertentangan tingkat baris terjadi, transaksi yang memblokir dan diblokir harus mengeluarkan pernyataan yang bertentangan dari jenis berikut:

  • UPDATE

  • SELECT … FOR UPDATE

  • SELECT … FOR KEY SHARE

Pernyataan SELECT … FOR KEY SHARE adalah kasus khusus. Basis data menggunakan klausa FOR KEY SHARE untuk mengoptimalkan performa integritas referensial. Kunci tingkat baris pada baris dapat memblokir perintah INSERT, UPDATE, dan DELETE pada tabel lain yang mereferensikan baris tersebut.

Kemungkinan penyebab peningkatan peristiwa tunggu

Saat peristiwa ini ditampilkan lebih dari biasanya, penyebabnya biasanya pernyataan UPDATE, SELECT … FOR UPDATE, atau SELECT … FOR KEY SHARE yang dikombinasikan dengan kondisi berikut.

Konkurensi tinggi

Aurora PostgreSQL dapat menggunakan semantik penguncian tingkat baris terperinci. Probabilitas pertentangan tingkat baris meningkat saat kondisi berikut terpenuhi:

  • Beban kerja bersamaan tingkat tinggi berselisih untuk baris yang sama.

  • Konkurensi meningkat.

Idle pada transaksi

Terkadang kolom pg_stat_activity.state menunjukkan nilai idle in transaction. Nilai ini ditampilkan untuk sesi yang telah memulai transaksi, tetapi belum mengeluarkan COMMIT atau ROLLBACK. Jika nilai pg_stat_activity.state tidak active, kueri yang ditampilkan pada pg_stat_activity adalah yang terbaru untuk diselesaikan. Sesi pemblokiran tidak secara aktif memproses kueri karena transaksi yang terbuka menahan kunci.

Jika transaksi idle memperoleh kunci tingkat baris, hal tersebut mungkin mencegah sesi lain memperolehnya. Kondisi ini menyebabkan peristiwa tunggu Lock:transactionid yang sering terjadi. Untuk mendiagnosis masalah, periksa output dari pg_stat_activity dan pg_locks.

Transaksi jangka panjang

Transaksi yang berjalan dalam jangka panjang mendapatkan kunci untuk jangka panjang. Kunci yang sudah lama dipegang ini dapat memblokir transaksi lain agar tidak berlangsung.

Tindakan

Penguncian baris adalah pertentangan antara pernyataan UPDATE, SELECT … FOR UPDATE, atau SELECT … FOR KEY SHARE. Sebelum mencoba solusi, cari tahu kapan pernyataan ini berjalan pada baris yang sama. Gunakan informasi ini untuk memilih strategi yang dijelaskan pada bagian berikut.

Menanggapi konkurensi tinggi

Jika masalahnya pada konkurensi, coba salah satu teknik berikut:

  • Menurunkan konkurensi pada aplikasi. Misalnya, mengurangi jumlah sesi aktif.

  • Menerapkan pool koneksi. Untuk mempelajari cara mengumpulkan koneksi dengan Proksi RDS, lihat RDSProxy Amazon untuk Aurora.

  • Desain aplikasi atau model data untuk menghindari perselisihan pernyataan UPDATE dan SELECT … FOR UPDATE. Anda juga dapat mengurangi jumlah kunci asing yang diakses oleh pernyataan SELECT … FOR KEY SHARE.

Menanggapi transaksi idle

Jika pg_stat_activity.state menampilkan idle in transaction, gunakan strategi berikut:

  • Aktifkan autocommit saat memungkinkan. Pendekatan ini mencegah transaksi memblokir transaksi lain sambil menunggu COMMIT atau ROLLBACK.

  • Cari jalur kode yang tidak memiliki COMMIT, ROLLBACK, atau END.

  • Pastikan logika penanganan pengecualian pada aplikasi Anda selalu memiliki jalur ke end of transaction yang valid.

  • Pastikan bahwa aplikasi Anda memproses hasil kueri setelah mengakhiri transaksi dengan COMMIT atau ROLLBACK.

Menanggapi transaksi jangka panjang

Jika transaksi jangka panjang menyebabkan Lock:transactionid yang sering terjadi, cobalah strategi berikut:

  • Jauhkan kunci baris dari transaksi jangka panjang.

  • Batasi panjang kueri dengan menerapkan autocommit bila memungkinkan.