Rumah >pangkalan data >tutorial mysql >Apakah kunci peringkat meja, kunci peringkat baris, kunci eksklusif dan kunci kongsi dalam MySQL?
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 transaksiKami 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.
.
Baca diserahkan, tahap kerja lalai Oracle. Pembacaan data tidak terikat tidak dibenarkan Tahap ini masih membenarkan bacaan tidak berulang dan bacaan maya berlaku.
Nota:
Semakin tinggi tahap pengasingan transaksi, semakin banyak prestasi dibelanjakan untuk mengelakkan konflik, yang ialah, kecekapan adalah rendah.
. 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 penyirianLog 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)
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
Enjin storan MyISAM hanya menyokong kunci peringkat jadual, manakala InnoDB menyokong pemprosesan transaksi, kunci peringkat baris, dan konkurensi yang lebih baik
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
Kami mula-mula menyemak jadual SQL dan kandungan
Lihat tahap pengasingan:
Mula-mula buka transaksi A dan tambahkan kunci eksklusif pada data dengan id=7:
Buka transaksi B pada pelanggan lain:
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
ditambah pada pokok indeks.
Setiap kali anda menyelesaikan ujian, gulung semula perkara yang baru anda lakukan.
Gunakan medan tidak diindeks jadual sebagai syarat penapis
Kini transaksi 2 mendapat rekod baris berbeza chenwei
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:
Kemudian lakukan operasi tadi:
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.
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)
Tetapkan tahap pengasingan bersiri:
Dua transaksi boleh memperoleh kunci kongsi pada masa yang sama (kewujudan bersama SS:
Sekarang biar transaksi 2 masukkan data;
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:
Buka dua transaksi:
Kerana kami Indeks ditambahkan pada nama. Pilihan di atas adalah bersamaan dengan menambahkan kunci kongsi baris pada data bernama zhangsanKemas kini Transaksi 2;
Transaksi 2 tidak boleh dikemas kini kerana keseluruhan jadual telah dikunci oleh kunci kongsi transaksi 1 pada masa iniTransaksi 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
Mari kita gunakannya sekali lagi Cuba indeks kunci utama untuk melihat sama ada kemas kini id
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
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 eksklusifSiri 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!