Rumah  >  Artikel  >  pangkalan data  >  Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

WBOY
WBOYke hadapan
2023-06-03 10:43:191327semak imbas

    Kata Pengantar

    Disebabkan kerumitan perniagaan kami, berbilang penyata SQL berkaitan yang membentuk urus niaga diperlukan. Jadi, mari kita jelaskan dahulu apa itu transaksi. Transaksi merujuk kepada sekumpulan pernyataan SQL yang dilaksanakan bersama-sama Semua mesti dilaksanakan dengan jayanya atau semua gagal atau kegagalan separa tidak dibenarkan. Sesuatu urus niaga mempunyai ciri-ciri ACID:

    • Atomicity: sama ada semua berjaya atau semua gagal, untuk memastikan konsistensi transaksi

    • Konsistensi: Sebagai contoh, dalam pemindahan bank, memotong wang dari satu orang mesti menambah wang kepada orang lain. daripada data. Dimusnahkan; untuk dipindahkan ke cakera. Seperti yang ditulis di atas, jika terdapat gangguan bekalan elektrik, masa mati atau mula semula pada masa ini, kami mempunyai log semula untuk memastikan ketahanan pangkalan data

    • Pengasingan: Bahagian ini boleh menjelaskan mengapa urus niaga mesti diasingkan, kerana urus niaga mesti dibenarkan untuk dilaksanakan secara serentak Satu perniagaan melibatkan banyak transaksi, dan kita selalunya mempunyai banyak perniagaan di latar belakang untuk melaksanakan secara serentak. Jika semua transaksi dilaksanakan secara bersiri, Jika ya, maka apabila kita menulis program berbilang benang, kita hanya mempunyai satu utas untuk melakukan sesuatu, yang sangat tidak cekap. Oleh itu, urus niaga mesti dilaksanakan secara serentak, tetapi pelaksanaan serentak melibatkan beberapa isu:

      Keselamatan & ketekalan transaksi
    • dan
    • Isu kecekapan selaras

      Kami menggunakan dua perkara ini sebagai titik rujukan konkurensi/pengasingan dalam MySQL Jika kita tidak mengasingkan transaksi sama sekali apabila melaksanakan secara serentak, bacaan kotor mungkin berlaku (urus niaga B membaca data transaksi A yang tidak terikat dan kemudian menggunakan transaksi A menggunakan data tidak komited untuk melaksanakan. pengiraan dan memperoleh banyak hasil lain, dan kemudian transaksi A melancarkan semula data tersebut Kemudian transaksi B mengira data bermasalah, dan bacaan kotor pasti akan menyebabkan masalah), Bacaan tidak boleh berulang (Dapatkan sekeping data di bawah. keadaan yang sama, dan kemudian mendapati bahawa nilai data telah berubah apabila membuat pertanyaan semula Sudah tentu, bacaan tidak boleh diulang mungkin tidak menyebabkan masalah dalam beberapa senario perniagaan data adalah berkaitan dengan ketat) dan bacaan hantu (jumlah data dalam hasil dua pertanyaan sebelum dan selepas keadaan yang sama berbeza dalam transaksi) adalah isu-isu ini. Kemudian untuk menyelesaikan masalah yang dihadapi dalam pelaksanaan transaksi serentak, kami memberikan tahap pengasingan transaksi:

    Pensirian, pensirian dilaksanakan sepenuhnya menggunakan kunci Semua urus niaga diisih melalui kunci dan dilaksanakan dengan cara ini keselamatan data adalah tinggi tetapi kecekapan serentak adalah sangat rendah.

      Bacaan tidak komited untuk program berbilang benang yang kami tulis, tiada kawalan serentak untuk segmen kod bahagian kritikal Walaupun konkurensinya tinggi, keselamatan data adalah sangat rendah bacaan juga membenarkan kewujudan bacaan kotor, yang bermasalah jadi bacaan tanpa komitmen tidak boleh digunakan.
    • Siri dan pembacaan tanpa komitmen tidak akan digunakan dalam projek sebenar Secara amnya, enjin pangkalan data berfungsi pada pembacaan komited dan bacaan boleh berulang secara lalai ini menggabungkan keselamatan & ketekalan data dan kecekapan serentak data dilaksanakan oleh mekanisme kawalan koncurrency berbilang versi MVCC

      .

    • Baca diserahkan, tahap kerja lalai Oracle. Pembacaan data tidak terikat tidak dibenarkan Tahap ini masih membenarkan bacaan tidak berulang dan bacaan maya berlaku.

    • Bacaan berulang, tahap kerja lalai MySQL. Dijamin bahawa data yang sama masih akan diperoleh apabila transaksi dibaca semula, yang sebahagiannya menyelesaikan masalah bacaan maya, tetapi bacaan maya masih akan berlaku

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?Nota:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Semakin tinggi tahap pengasingan transaksi, semakin banyak prestasi dibelanjakan untuk mengelakkan konflik, yang ialah, kecekapan adalah rendah.

      Di peringkat "Baca Berulang", ia sebenarnya boleh menyelesaikan beberapa masalah bacaan maya, tetapi ia tidak dapat menghalang masalah bacaan maya yang disebabkan oleh kemas kini untuk melarang berlakunya maya berbunyi, anda masih perlu menetapkan tahap pengasingan Siri.
    • Prinsip pelaksanaan tahap pengasingan transaksi:
    • kunci+MVCC

      . Prinsip pelaksanaan bersiri adalah kunci termasuk kunci kongsi, kunci eksklusif, kunci kongsi niat, kunci eksklusif niat, kunci celah dan jalan buntu Prinsip pelaksanaan asas pembacaan yang komited dan boleh dibaca berulang: MVCC (kawalan serentak Versi berbilang). MVCC menyediakan kaedah bacaan serentak, termasuk bacaan syot kilat (data yang sama akan mempunyai berbilang versi), bacaan semasa, buat asal log dan buat semula log.

      MVCC ialah prinsip pembacaan yang komited dan pembacaan berulang, dan kunci ialah prinsip penyirian

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Log transaksi digunakan untuk melaksanakan ciri ACID, manakala kunci kongsi, kunci eksklusif dan MVCC digunakan untuk melaksanakan ciri ketekalan (I). Log transaksi dibahagikan kepada log buat asal (log putar balik) dan log buat semula (log semula)

    1. Kunci peringkat jadual & kunci peringkat baris

    • Kunci Aras Meja: Kunci keseluruhan meja. Overhed adalah kecil (kerana anda tidak perlu mencari rekod baris tertentu dalam jadual untuk menguncinya. Jika anda ingin mengubah suai jadual ini, anda terus memohon kunci meja ini), kuncinya pantas, dan tidak akan ada

    • Kebuntuan hadir;Kebutiran kunci adalah besar, kebarangkalian konflik kunci adalah tinggi, dan keselarasan adalah rendah

    • Kunci peringkat baris:Untuk rekod Baris tertentu dikunci. Ia mahal (anda perlu mencari rekod yang sepadan dalam jadual, dan terdapat proses mencari jadual dan indeks), mengunci adalah perlahan, dan kebuntuan akan berlaku adalah yang paling kecil, kebarangkalian konflik kunci adalah terendah, dan konkurensinya tinggi

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Enjin storan MyISAM hanya menyokong kunci peringkat jadual, manakala InnoDB menyokong pemprosesan transaksi, kunci peringkat baris, dan konkurensi yang lebih baik

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    2. Kunci eksklusif & kunci kongsi

    • Kunci eksklusif: juga dikenali sebagai X kunci, tulis kunci

    • Kunci kongsi: Juga dikenali sebagai kunci S, kunci baca

    Membaca (SS) ialah serasi, tetapi membaca dan menulis (SX, SX ), menulis dan menulis (XX) adalah saling eksklusif

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    1. Uji keserasian kunci eksklusif dan kunci kongsi antara transaksi yang berbeza

    Kami mula-mula menyemak jadual SQL dan kandungan

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Lihat tahap pengasingan:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Mula-mula buka transaksi A dan tambahkan kunci eksklusif pada data dengan id=7:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Buka transaksi B pada pelanggan lain:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Tidak kira menambah kunci eksklusif atau kunci kongsi pada id=7, ia disekat dan tidak boleh ditanya, kerana transaksi A Kunci eksklusif ditambahkan pada data dalam baris dengan id=7, yang merupakan kunci tulis Orang lain tidak boleh membaca atau menulis.

    Ringkasan: Untuk kunci data antara transaksi yang berbeza, hanya kunci SS boleh wujud bersama, XX, SX dan XS tidak boleh wujud bersama

    2. Kunci baris ujian ditambahkan pada pelaksanaan kunci pada item indeks

    ditambah pada pokok indeks.

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Setiap kali anda menyelesaikan ujian, gulung semula perkara yang baru anda lakukan.

    Gunakan medan tidak diindeks jadual sebagai syarat penapis

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Kini transaksi 2 mendapat rekod baris berbeza chenwei

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    InnoDB menyokong kunci baris Apabila id kunci utama digunakan sebagai syarat penapis sebentar tadi, transaksi 1 dan transaksi 2 boleh berjaya memperoleh kunci untuk baris yang berbeza. Walau bagaimanapun, kini kami mendapati bahawa kami tidak boleh mendapatkan kunci eksklusif bernama chenwei Mengapa ini? Mari jelaskan:

    Kunci baris InnoDB dilaksanakan dengan mengunci entri indeks, bukannya mengunci rekod baris jadual

    Dan kami Menggunakan nama sebagai keadaan penapis tidak menggunakan indeks , jadi secara semula jadi kunci baris tidak akan digunakan, tetapi kunci meja akan digunakan. Ini bermakna InnoDB menggunakan kunci peringkat baris hanya apabila data diambil melalui indeks, jika tidak InnoDB akan menggunakan kunci jadual!!!

    Kami menambah indeks pada medan nama:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Kemudian lakukan operasi tadi:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Kami mendapati bahawa selepas menambah indeks pada nama, dua transaksi boleh mendapatkan kunci eksklusif (untuk kemas kini) pada baris yang berbeza, yang sekali lagi membuktikan bahawa kunci baris InnoDB ditambahkan pada item indeks.

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Oleh kerana nama kini dalam indeks, gunakan zhangsan untuk mencari id rekod baris di mana ia terletak pada pokok indeks tambahan, iaitu 7, dan kemudian pergi ke pepohon indeks kunci utama untuk mendapatkan baris yang sepadan Rekod kunci eksklusif (tekaan peribadi ialah rekod yang sepadan dalam pepohon indeks tambahan dan pepohon indeks kunci utama dikunci)

    3

    Sirikan semua urus niaga adalah semua kunci kongsi atau kunci eksklusif, tidak perlu menambahnya secara manual. Select memperoleh kunci yang dikongsi, manakala sisipkan, padam dan kemas kini memperoleh kunci eksklusif.

    Tetapkan tahap pengasingan bersiri:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Dua transaksi boleh memperoleh kunci kongsi pada masa yang sama (kewujudan bersama SS:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Sekarang biar transaksi 2 masukkan data;

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Sebab Sisipan perlu menambahkan Ia dikunci, tetapi memandangkan transaksi 1 telah menambah kunci dikongsi pada keseluruhan jadual, transaksi 2 tidak lagi berjaya mengunci jadual (sx tidak wujud bersama)

    gulung semula dan semua status perolehan kunci digulung semula:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Buka dua transaksi:

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Kerana kami Indeks ditambahkan pada nama. Pilihan di atas adalah bersamaan dengan menambahkan kunci kongsi baris pada data bernama zhangsan

    Kemas kini Transaksi 2;

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Transaksi 2 tidak boleh dikemas kini kerana keseluruhan jadual telah dikunci oleh kunci kongsi transaksi 1 pada masa ini

    Transaksi 2 mencari zhangsan pada pokok indeks tambahan, mencari nilai kunci utama yang sepadan, dan kemudian pergi ke kunci utama Pepohon indeks menemui rekod yang sepadan, tetapi mendapati baris rekod ini telah dikunci oleh kunci kongsi 2 boleh mendapatkan kunci kongsi, tetapi tidak boleh mendapatkan kunci eksklusif

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL? Mari kita gunakannya sekali lagi Cuba indeks kunci utama untuk melihat sama ada kemas kini id

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL? masih disekat walaupun medan di belakang tempat kami kini menggunakan id bukannya nama, nama itu juga ditemui melalui pepohon indeks tambahan Kunci utama yang sepadan kemudiannya dicari untuk rekod yang sepadan dalam pepohon indeks kunci utama dan rekod pada pepohon indeks kunci utama dikunci

    Kami mengemas kini data dengan id=8 dengan jayanya kerana apabila kami memilih, kami hanya memberikannya Data dengan id=7 mempunyai kunci baris Sudah tentu, kami boleh berjaya mengendalikan data dengan id=8

    Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?

    Jika ada indeks, gunakan kunci baris; jika tiada indeks, Kemudian gunakan kunci meja kunci peringkat baris merujuk kepada butiran kunci, manakala kunci kongsi dan kunci eksklusif merujuk kepada sifat kunci, sama ada kunci meja atau kunci baris , terdapat perbezaan antara kunci kongsi dan kunci eksklusif

    Siri menggunakan kunci eksklusif dan kunci kongsi Pada tahap bacaan yang boleh diulang, jika anda tidak mengunci secara manual, MVCC sebenarnya tidak menggunakan kunci secara manual buat indeks, ia menggunakan kunci jadual. Jika item indeks digunakan dalam pertanyaan, ia menggunakan kunci baris adalah Kunci indeks dan bukannya mengunci baris data

    .

    Atas ialah kandungan terperinci Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?. 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