Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
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 RDSProxy Amazon .
-
Desain aplikasi atau model data untuk menghindari pertentangan pernyataan
UPDATE
danSELECT … FOR UPDATE
. Anda juga dapat mengurangi jumlah kunci asing yang diakses oleh pernyataanSELECT … 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
atauROLLBACK
. -
Cari jalur kode yang tidak memiliki
COMMIT
,ROLLBACK
, atauEND
. -
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
atauROLLBACK
.
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.