Rumah  >  Artikel  >  pangkalan data  >  Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

WBOY
WBOYke hadapan
2023-05-27 22:22:021471semak imbas

    1. Kunci peringkat jadual InnoDB

    Kunci peringkat baris biasanya harus digunakan untuk memastikan integriti transaksi, dan ini juga merupakan sebab biasa untuk memilih enjin InnoDB. Walau bagaimanapun, dalam kes individu, kunci aras meja mungkin juga diperlukan.

    Urus niaga perlu mengemas kini kebanyakan atau semua data, dan jadual adalah agak besar Jika kunci baris lalai digunakan, bukan sahaja kecekapan pelaksanaan transaksi menjadi rendah, tetapi ia juga boleh menyebabkan transaksi lain. untuk menunggu lama dan mengunci konflik Urus niaga melibatkan berbilang jadual , yang lebih rumit dan berkemungkinan menyebabkan kebuntuan dan menyebabkan sejumlah besar penarikan balik urus niaga

    Apabila kita ingin mendapatkan jadual. kunci, laksanakan arahan berikut:

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Apabila menggunakan kunci meja, isu kecekapan terlibat:
    Untuk mendapatkan kunci kongsi S atau kunci eksklusif X pada meja, anda mesti terlebih dahulu memastikan bahawa jadual itu belum diperolehi oleh transaksi lain Selepas kunci X, data dalam jadual ini belum diperoleh oleh transaksi lain.

    Andaikan kita mempunyai 10 juta data dalam jadual ini, bagaimana untuk menentukan baris mana daripada 10 juta data ini mempunyai kunci X?
    Jika anda ingin mendapatkan kunci S jadual, anda perlu menentukan baris dalam jadual yang mempunyai kunci X Jika sesetengah baris mempunyai kunci X, anda tidak boleh mendapatkan kunci S atau kunci X jadual ini. Tiada cara yang lebih baik daripada menyemak satu demi satu, yang membawa kepada ketidakcekapan

    Ketidakcekapan yang disebabkan oleh keperluan untuk menambah kunci jadual adalah untuk merentasi data satu demi satu untuk menentukan sama ada beberapa data telah dikunci baris masalah. Kunci kongsi niat dan kunci eksklusif niat yang kami pelajari di sini boleh diselesaikan Apabila anda ingin mendapatkan kunci X meja, anda tidak perlu lagi menyemak kunci baris mana dalam jadual yang diduduki oleh (X atau S. ), anda hanya perlu menyemak IX dengan cepat Hanya kunci dengan IS .

    2. Kunci kongsi niat dan kunci eksklusif niat

    • Kunci kongsi niat (kunci IS): Pelan transaksi menambah kunci kongsi baris untuk dirakam , sebelum transaksi menambah kunci kongsi pada baris rekod, ia mesti mendapatkan kunci IS jadual dahulu

    • Kunci eksklusif niat (kunci IX): Kunci eksklusif niat pelan transaksi menambah rekod pada jadual kunci eksklusif Baris Sebelum menambah kunci eksklusif pada rekod baris, transaksi mesti mendapatkan kunci IX jadual itu dahulu. 🎜>

    Sebelum menambah kunci baris, kunci IS atau IX Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    • jadual yang ditambahkan oleh enjin storan InnoDB ialah serasi antara satu sama lain tidak akan ada konflik, terutamanya untuk membantu orang lain mempercepatkan kecekapan apabila memperoleh kunci meja

    • Tujuan kunci niat adalah untuk memperoleh meja. mengunci dengan lebih cekap (X dan X dalam jadual S merujuk kepada kunci meja , bukan kunci baris! )

    • kunci niat ialah kunci peringkat meja ,

      kunci meja koordinasi dan kunci baris kewujudan bersama
    • . Tujuan utama adalah untuk menunjukkan bahawa transaksi mengunci baris atau cuba mengunci baris.
    • Analisis transaksi 1 untuk memperoleh kunci baris X dan transaksi 2 untuk memperoleh kunci S jadual:

    • Apabila transaksi 1 perlu memberikan Baris ke-10 data pada jadual Apabila menambah kunci X, enjin storan InnoDB secara automatik menambah kunci IX pada keseluruhan jadual. Apabila transaksi 2 ingin memperoleh kunci S bagi keseluruhan jadual, ia melihat bahawa transaksi lain telah memperoleh kunci IX pada jadual ini, yang bermaksud bahawa mesti terdapat beberapa data dalam jadual ini yang telah ditambahkan pada kunci X, yang menghasilkan dalam Transaksi 2 tidak boleh menambah kunci S pada keseluruhan jadual. Pada masa ini, transaksi 2 hanya boleh menunggu dan tidak berjaya memperoleh kunci S jadual

    3. Kebuntuan1 Kebuntuan dalam pangkalan data

    Kunci meja MyISAM bebas kebuntuan , ini kerana

    MyISAM tidak menyokong transaksi, hanya kunci meja Ia sentiasa memperoleh semua kunci yang diperlukan pada satu masa, sama ada semua berpuas hati atau menunggu, jadi kebuntuan tidak akan berlaku

    . Walau bagaimanapun, dalam InnoDB, kecuali untuk urus niaga yang terdiri daripada satu SQL, kunci diperoleh secara beransur-ansur, iaitu, butiran kunci adalah agak kecil, yang menentukan bahawa kebuntuan mungkin berlaku dalam InnoDB. Sudah tentu, jika berbilang jadual diproses, kebuntuan mungkin masih berlaku.

    Masalah jalan buntu biasanya disebabkan oleh diri kita sendiri. Sama seperti situasi kebuntuan dalam pengaturcaraan berbilang utas, kebanyakannya disebabkan oleh susunan yang berbeza di mana berbilang rangkaian memperoleh sumber kunci berbilang. Oleh itu, apabila kami menggunakan segmen kod yang berbeza untuk mengemas kini berbilang jadual dalam pangkalan data, jadual ini harus dikemas kini dalam susunan yang sama untuk mengelakkan konflik kunci daripada menyebabkan masalah kebuntuan.

    2. Senario dan penyelesaian kebuntuan

    Senario di mana kebuntuan berlaku adalah seperti berikut:

    Transaksi 1 berjaya memperoleh kunci baris 1

    Transaksi 2 Berjaya memperoleh kunci baris 2

    Transaksi 1 tidak dapat memperoleh kunci baris 2. Semasa disekat, tiada cara untuk melaksanakan komit/putar balik dan tidak dapat melepaskan kunci baris 1Transaksi 2 ialah tidak dapat memperoleh kunci baris 1 dan telah disekat Tidak ada cara untuk melaksanakan komit/putar balik semasa menyekat, dan kunci baris 2 tidak boleh dilepaskan. , yang bersamaan dengan semua utas dalam proses disekat, menyebabkan masalah Deadlock.

    Kaedah untuk menyelesaikan kebuntuan: Apabila berbilang transaksi/benang memperoleh berbilang kunci sumber yang sama, mereka harus memperoleh kunci sumber dalam susunan yang sama.

    Urus niaga disekat atau buntu mysqld (MySQL Server daemon) ditetapkan dengan masa tamat untuk penyekatan transaksi Transaksi tidak akan disekat untuk masa yang lama dan transaksi akan diproses selepas tamat masa Apabila gagal, kunci yang dipegang pada masa ini dilepaskan secara automatik.

    3. Operasi

    Tetapkan komit manual dan tahap pengasingan bacaan boleh berulang dan buka transaksi

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Soal data jadual, dalam Boleh Diulang Tahap pengasingan baca menggunakan syot kilat dibaca yang disediakan oleh MVCC dan tidak mengunci

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Transaksi 1 memperoleh kunci eksklusif dengan id=7 dan transaksi 2 memperoleh kunci eksklusif dengan id =8

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Transaksi 1 memperoleh kunci eksklusif dengan id=8 sekali lagi dan penyekatan berlaku

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Transaksi 2 memperoleh id= sekali lagi 7 kunci eksklusif, penyekatan berlaku

    Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?

    Pada masa ini, Pelayan MySQL mengesan bahawa kebuntuan telah berlaku, jadi ia menyahsekat transaksi 1, melancarkan transaksi 1 dan melepaskan itu. Kunci baris yang diduduki, jadi transaksi 2 berjaya memperoleh kunci eksklusif dengan id=7

    3. Cadangan pengoptimuman kunci

    • Atas premis perniagaan itu boleh selesai dengan betul, Untuk memastikan kecekapan, cuba gunakan tahap pengasingan yang lebih rendah (bacaan kotor mesti dielakkan)

    • Reka bentuk indeks yang munasabah dan cuba gunakan indeks untuk mengakses data, menjadikan penguncian lebih tepat, mengurangkan kemungkinan konflik kunci dan meningkatkan keupayaan serentak

    • Pilih saiz transaksi yang munasabah Kebarangkalian konflik kunci untuk transaksi kecil ialah kecil (semakin besar urus niaga, lebih banyak Semakin banyak SQL terdapat, ia mungkin mengandungi lebih banyak kunci pada sumber jadual dan sumber baris, yang meningkatkan kebarangkalian konflik kunci.) Apabila program yang berbeza mengakses sekumpulan jadual, mereka harus cuba bersetuju untuk mengakses setiap jadual dalam susunan yang sama Untuk jadual , mengakses baris dalam jadual dalam susunan tetap apabila boleh. Ini boleh mengurangkan peluang kebuntuan dengan banyaknya

    • Cuba gunakan keadaan kesamarataan untuk mengakses data, yang boleh mengelakkan kesan kunci jurang pada sisipan serentak (sebenarnya, pertanyaan yang sama juga akan Tambah kunci jurang) Jangan memohon tahap kunci yang melebihi keperluan sebenar

    • Jika tidak perlu, elakkan menggunakan penguncian eksplisit semasa membuat pertanyaan, kerana di bawah bacaan komited dan tahap pengasingan bacaan berulang, MVCC telah menyediakan mekanisme bacaan tanpa penguncian manual

    Atas ialah kandungan terperinci Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam