Rumah > Artikel > pangkalan data > Apakah kunci kongsi niat MySQL, kunci eksklusif niat dan kebuntuan?
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:
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 .
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
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 bersamaAnalisis transaksi 1 untuk memperoleh kunci baris X dan transaksi 2 untuk 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 berlaku2. Senario dan penyelesaian kebuntuan
Senario di mana kebuntuan berlaku adalah seperti berikut:…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.
Tetapkan komit manual dan tahap pengasingan bacaan boleh berulang dan buka transaksi
Soal data jadual, dalam Boleh Diulang Tahap pengasingan baca menggunakan syot kilat dibaca yang disediakan oleh MVCC dan tidak mengunci
Transaksi 1 memperoleh kunci eksklusif dengan id=7 dan transaksi 2 memperoleh kunci eksklusif dengan id =8
Transaksi 1 memperoleh kunci eksklusif dengan id=8 sekali lagi dan penyekatan berlaku
Transaksi 2 memperoleh id= sekali lagi 7 kunci eksklusif, penyekatan berlaku
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
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!