synch/mutex/innodb/aurora_lock_thread_slot_futex - Amazon Aurora

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

synch/mutex/innodb/aurora_lock_thread_slot_futex

Peristiwa synch/mutex/innodb/aurora_lock_thread_slot_futex terjadi ketika satu sesi telah mengunci baris untuk pembaruan dan sesi lain mencoba memperbarui baris yang sama. Untuk informasi selengkapnya, lihat Penguncian InnoDB dalam Referensi MySQL.

Versi mesin yang didukung

Informasi peristiwa tunggu ini didukung untuk versi mesin berikut:

  • Aurora MySQL versi 2

catatan

Di Aurora MySQL versi 3.01.0 dan 3.01.1, peristiwa tunggu ini dilaporkan sebagai io/table/sql/handler.

Kemungkinan penyebab peningkatan peristiwa tunggu

Beberapa pernyataan bahasa manipulasi data (DML) mengakses baris atau sejumlah baris yang sama secara serentak.

Tindakan

Kami merekomendasikan berbagai tindakan, tergantung pada peristiwa tunggu lain yang Anda lihat.

Menemukan dan merespons pernyataan SQL yang bertanggung jawab atas peristiwa tunggu ini

Gunakan Wawasan Performa untuk mengidentifikasi pernyataan SQL yang bertanggung jawab atas peristiwa tunggu ini. Pertimbangkan strategi berikut:

  • Jika kunci baris merupakan masalah yang terus-menerus, coba tulis ulang aplikasi untuk menggunakan penguncian optimis.

  • Gunakan pernyataan multibaris.

  • Bagikan beban kerja ke objek basis data yang berbeda-beda. Anda dapat melakukannya melalui partisi.

  • Periksa nilai parameter innodb_lock_wait_timeout. Parameter ini mengontrol durasi transaksi menunggu sebelum menghasilkan kesalahan batas waktu.

Untuk ikhtisar pemecahan masalah yang berguna menggunakan Wawasan Performa, lihat postingan blog Menganalisis Beban Kerja Amazon Aurora MySQL dengan Wawasan Performa.

Menemukan dan merespons sesi pemblokiran

Cari tahu apakah sesi pemblokiran idle atau aktif. Cari tahu juga apakah sesi tersebut berasal dari aplikasi atau pengguna aktif.

Untuk mengidentifikasi sesi yang memegang kunci, Anda dapat menjalankan SHOW ENGINE INNODB STATUS. Contoh berikut menunjukkan output sampel.

mysql> SHOW ENGINE INNODB STATUS; ---------------------TRANSACTION 302631452, ACTIVE 2 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s) MySQL thread id 80109, OS thread handle 0x2ae915060700, query id 938819 10.0.4.12 reinvent updating UPDATE sbtest1 SET k=k+1 WHERE id=503 ------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 148 page no 11 n bits 30 index `PRIMARY` of table `sysbench2`.`sbtest1` trx id 302631452 lock_mode X locks rec but not gap waiting Record lock, heap no 30 PHYSICAL RECORD: n_fields 6; compact format; info bits 0

Sebagai alternatif, Anda dapat menggunakan kueri berikut untuk mengekstrak detail tentang kunci saat ini.

mysql> SELECT p1.id waiting_thread, p1.user waiting_user, p1.host waiting_host, it1.trx_query waiting_query, ilw.requesting_trx_id waiting_transaction, ilw.blocking_lock_id blocking_lock, il.lock_mode blocking_mode, il.lock_type blocking_type, ilw.blocking_trx_id blocking_transaction, CASE it.trx_state WHEN 'LOCK WAIT' THEN it.trx_state ELSE p.state END blocker_state, il.lock_table locked_table, it.trx_mysql_thread_id blocker_thread, p.user blocker_user, p.host blocker_host FROM information_schema.innodb_lock_waits ilw JOIN information_schema.innodb_locks il ON ilw.blocking_lock_id = il.lock_id AND ilw.blocking_trx_id = il.lock_trx_id JOIN information_schema.innodb_trx it ON ilw.blocking_trx_id = it.trx_id JOIN information_schema.processlist p ON it.trx_mysql_thread_id = p.id JOIN information_schema.innodb_trx it1 ON ilw.requesting_trx_id = it1.trx_id JOIN information_schema.processlist p1 ON it1.trx_mysql_thread_id = p1.id\G *************************** 1. row *************************** waiting_thread: 3561959471 waiting_user: reinvent waiting_host: 123.456.789.012:20485 waiting_query: select id1 from test.t1 where id1=1 for update waiting_transaction: 312337314 blocking_lock: 312337287:261:3:2 blocking_mode: X blocking_type: RECORD blocking_transaction: 312337287 blocker_state: User sleep locked_table: `test`.`t1` blocker_thread: 3561223876 blocker_user: reinvent blocker_host: 123.456.789.012:17746 1 row in set (0.04 sec)

Saat mengidentifikasi sesi, opsi Anda mencakup yang berikut:

  • Menghubungi pemilik aplikasi atau pengguna.

  • Jika sesi pemblokiran idle, coba akhiri sesi pemblokiran. Tindakan ini dapat memicu rollback yang panjang. Untuk mempelajari cara mengakhiri sesi, lihat Mengakhiri sesi atau kueri.

Untuk informasi selengkapnya tentang cara mengidentifikasi transaksi pemblokiran, lihat Menggunakan Informasi Penguncian dan Transaksi InnoDB dalam Panduan Referensi MySQL.