Lock:transactionid - Layanan Basis Data Relasional Amazon

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 RDS for 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 yang memblokir berakhir dengan pernyataan COMMIT atau ROLLBACK, transaksi yang diblokir dapat dilanjutkan.

Semantik kontrol konkurensi multiversi dari RDS for 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 adalah 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:

  • Beberapa beban kerja yang sangat konkuren bersaing 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 bukan active, kueri yang ditampilkan pada pg_stat_activity adalah yang paling baru diselesaikan. Sesi yang memblokir tidak secara aktif memproses kueri karena transaksi yang terbuka menahan kunci.

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

Transaksi yang berjalan lama

Transaksi yang berjalan dalam waktu lama akan mendapatkan kunci untuk waktu lama. Kunci yang lama dipegang ini dapat memblokir transaksi lain sehingga tidak berjalan.

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.

Tangani konkurensi tinggi

Jika masalahnya adalah konkurensi, coba salah satu teknik berikut:

  • Turunkan konkurensi pada aplikasi. Misalnya, kurangi jumlah sesi aktif.

  • Terapkan pool koneksi. Untuk mempelajari cara melakukan pooling koneksi dengan Proksi RDS, lihat Menggunakan Proksi Amazon RDS.

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

Tangani 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.

Tangani transaksi yang berjalan lama

Jika transaksi yang berjalan lama menyebabkan Lock:transactionid sering terjadi, coba strategi berikut:

  • Cegah kunci baris dari transaksi jangka panjang.

  • Batasi panjang kueri dengan menerapkan autocommit jika memungkinkan.