View a markdown version of this page

Batas waktu transaksi di Amazon Aurora MySQL - Amazon Aurora

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

Batas waktu transaksi di Amazon Aurora MySQL

aurora_transaction_timeoutParameter menetapkan durasi maksimum untuk transaksi. Parameter ini dapat membantu mencegah transaksi yang berjalan lama (aktif atau idle) memblokir pembersihan InnoDB, yang dapat menyebabkan masalah kinerja. Parameter ini tersedia di Aurora MySQL versi 8.4.8 dan lebih tinggi.

Rincian parameter

aurora_transaction_timeoutParameter mengakhiri transaksi InnoDB yang berlangsung lebih lama dari durasi yang ditentukan, termasuk transaksi read-only. Anda menentukan nilainya dalam hitungan detik. Nilai nol (default) menonaktifkan batas waktu.

Tabel berikut merangkum detail parameter.

Properti Nilai
Nama aurora_transaction_timeout
Lingkup Sesi, Global
Default 0 (dinonaktifkan)
Unit Detik
Dinamis Ya, hanya berlaku untuk transaksi InnoDB baru

Anda dapat mengatur aurora_transaction_timeout parameter pada tingkat cluster, instance, atau sesi. Untuk informasi selengkapnya tentang bekerja dengan grup parameter, lihatKelompok parameter untuk Amazon Aurora.

Perilaku waktu habis

aurora_transaction_timeoutParameter ini berlaku untuk transaksi InnoDB yang mengeksekusi pernyataan DML, termasuk transaksi read-only. Semua pernyataan komit implisit, kecuali CREATE TABLE .. AS SELECT (CTAS) danLOAD DATA, dikecualikan dari batas waktu. Nilai batas waktu ditangkap saat pernyataan InnoDB pertama berjalan. Nilai tetap tetap selama masa transaksi itu.

Ketika batas waktu berakhir, hasilnya tergantung pada status transaksi:

  • Jika ada kueri aktif dalam transaksi, kueri terganggu dan transaksi diputar kembali. Koneksi tetap dapat digunakan.

  • Jika tidak ada kueri aktif (yaitu, transaksi tidak aktif), koneksi dihentikan.

Contoh

Contoh berikut menunjukkan kapan timer dimulai untuk skenario transaksi yang berbeda.

Transaksi eksplisit

BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).

Timer dimulai pada pernyataan 2 (pernyataan InnoDB pertama).

komit otomatis = 0

SET SESSION autocommit=0; -- No transaction yet SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE. INSERT INTO t1 ...; -- Same transaction, timer still running from step 2.

Timer dimulai pada pernyataan 2 (pernyataan InnoDB pertama setelah autocommit dinonaktifkan).

Prosedur tersimpan

Prosedur tersimpan berjalan dalam konteks transaksi pemanggil. Jika penelepon sudah memiliki transaksi InnoDB aktif, pengatur waktu sudah dimulai sebelum panggilan prosedur. Jika prosedur adalah hal pertama yang menyentuh InnoDB, pengatur waktu dimulai pada pernyataan InnoDB pertama di dalam prosedur.

BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc

Catatan kunci

  • Batas waktu ditangkap saat transaksi dimulai — Nilai batas waktu ditangkap saat pernyataan InnoDB pertama dieksekusi. Perubahan aurora_transaction_timeout di tengah transaksi akan berlaku pada transaksi berikutnya, bukan transaksi saat ini. Tidak ada peringatan yang diajukan.

  • Transaksi XA PREPARED dikecualikan — Transaksi yang disiapkan tidak tunduk padaaurora_transaction_timeout.

  • Sesi penerusan tulis tidak tunduk pada batas waktu transaksi — Saat penerusan tulis diaktifkan, pernyataan atau transaksi apa pun yang berisi pernyataan yang diteruskan tidak tunduk padaaurora_transaction_timeout. Transaksi berikutnya pada sesi yang sama yang tidak menyertakan laporan yang diteruskan tunduk pada batas waktu seperti biasa. Untuk mengontrol waktu tunggu idle untuk transaksi yang diteruskan, Anda dapat menggunakan aurora_fwd_writer_idle_timeout parameter. Untuk informasi selengkapnya, lihat Parameter konfigurasi untuk penerusan tulis di Aurora MySQL.

  • Berhati-hatilah dengan nilai batas waktu yang tinggi — Saat transaksi yang berjalan lama dibatalkan, rollback dapat memakan waktu beberapa kali lebih lama daripada operasi perubahan data asli. Mematikan proses database tidak membantu karena rollback dimulai ulang pada startup server. Pilih nilai batas waktu yang menyeimbangkan kebutuhan beban kerja Anda dengan biaya rollback. Untuk informasi selengkapnya, lihat Meng optimalkan Manajemen Transaksi InnoDB dalam dokumentasi MySQL.

Kesalahan klien

Ketika transaksi dengan kueri aktif melebihi batas waktu, klien menerima kesalahan berikut:

ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.

Ketika transaksi idle melebihi batas waktu, kueri berikutnya menerima kesalahan yang sama dengan kesalahan MySQL “server gone away”. Untuk informasi lebih lanjut, lihat MySQL server has gone di dokumentasi MySQL.

Log kesalahan

Pesan informasi ditulis ke log kesalahan database ketika batas waktu transaksi terjadi:

[Note] Transaction breached timeout threshold and will be rolled back, if still in progress. If idle, the connection will be aborted. Check response for confirmation. connection_id: 4821, trx_id: 28193, user: app_user, timeout: 5 seconds, duration: 7 seconds
catatan

Pesan log ini hanya untuk tujuan diagnostik. Andalkan respons klien sebagai indikator definitif dari transaksi time-out.

Memantau batas waktu transaksi

Gunakan variabel Aurora_transaction_timeouts status untuk melacak berapa banyak transaksi yang telah habis waktu sejak instance DB dimulai ulang.

SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';

Ketika performance_schema diaktifkan, kesalahan batas waktu (ER_AURORA_TRANSACTION_TIMEOUT_ERROR) juga dilacak dalam performance_schema.events_errors_summary_global_by_error dan tabel terkait. Perhatikan bahwa hanya batas waktu transaksi aktif yang menambah penghitung ini; batas waktu transaksi idle mengakhiri koneksi tanpa menimbulkan kesalahan. ER_AURORA_TRANSACTION_TIMEOUT_ERROR

Interaksi dengan batas waktu lainnya

Bekerja aurora_transaction_timeout di samping parameter batas waktu yang ada. Jika transaksi tetap terbuka lebih lama dari yang dikonfigurasiaurora_transaction_timeout, transaksi dihentikan terlepas dari pengaturan batas waktu lainnya. Apakah batas waktu lain juga memutar kembali transaksi tergantung pada implementasinya sendiri. Untuk detail tentang parameter ini, lihat dokumentasi MySQL.