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
danSELECT … FOR UPDATE
. Anda juga dapat mengurangi jumlah kunci asing yang diakses oleh pernyataanSELECT … 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
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
.
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.