Rumah > pangkalan data > tutorial mysql > Bagaimanakah Saya Boleh Menghalang Ralat 'Kebuntuan Ditemui Semasa Mencuba Mengunci' dalam Sistem Penjejakan Pengguna Dalam Talian MySQL Saya?

Bagaimanakah Saya Boleh Menghalang Ralat 'Kebuntuan Ditemui Semasa Mencuba Mengunci' dalam Sistem Penjejakan Pengguna Dalam Talian MySQL Saya?

Linda Hamilton
Lepaskan: 2024-12-15 18:52:15
asal
312 orang telah melayarinya

How Can I Prevent

Mengelakkan 'Kebuntuan Ditemui Semasa Cuba Mengunci' dalam MySQL

Isu:

Seorang pembangun menemui 'Kebuntuan terputus-putus ditemui apabila cuba mendapatkan kunci; cuba mulakan semula ralat transaksi apabila menjalankan INSERTs ke dalam jadual InnoDB yang menjejaki aktiviti pengguna dalam talian. Jadual dikemas kini pada muat semula halaman dan dikosongkan setiap 15 minit oleh tugas cron.

Pertanyaan dalam Soalan:

  • Lawatan pertama: INSERT INTO onlineusers (ip , datetime, userid, page, area, type) VALUES (ip, now(), userid, '/thispage', 'thisarea', 3)
  • Muat semula halaman: KEMASKINI pengguna dalam talian SET ip = ip, datetime = now(), userid = userid, page = '/thispage', area = 'thisarea', type = 3 WHERE id = 888
  • Cron job setiap 15 minit: PADAM DARIPADA pengguna dalam talian WHERE datetime <= now() - INTERVAL 900 SECOND

Penyelesaian:

Untuk menyelesaikan kebuntuan, adalah penting untuk memastikan transaksi mengunci kunci dalam susunan yang konsisten. Berikut ialah langkah yang disyorkan:

  1. Kunci Pesanan dalam Pertanyaan:

    • Pastikan semua pertanyaan yang mengunci berbilang kunci berbuat demikian dalam menaik pesanan untuk kunci.
  2. Isih Padam Pernyataan:

    • Ubah suai kenyataan DELETE untuk memasukkan subkueri yang mendapatkan semula nilai kunci utama (dalam kes ini, id) dalam tertib menaik, seperti ini:
    DELETE FROM onlineusers
    WHERE id IN (
        SELECT id
        FROM onlineusers
        WHERE datetime <= now() - INTERVAL 900 SECOND
        ORDER BY id
    ) u;
    Salin selepas log masuk
  3. Mekanisme Cuba Semula:

    • Pertimbangkan untuk melaksanakan mekanisme cuba semula dalam kod klien untuk khusus ini ralat, membenarkannya mencuba semula secara automatik beberapa kali.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Ralat 'Kebuntuan Ditemui Semasa Mencuba Mengunci' dalam Sistem Penjejakan Pengguna Dalam Talian MySQL Saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan