Rumah > pangkalan data > tutorial mysql > Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

WBOY
Lepaskan: 2022-02-11 18:59:00
ke hadapan
3146 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang pelbagai jenis dan mod kunci dalam MySQL. Saya harap ia akan membantu anda.

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Dalam kerja pembangunan harian, kita perlu berurusan dengan pangkalan data hampir setiap hari Sebagai SQL BOY yang hanya tahu CRUD, selain menggunakan mybatis-generator untuk menjana secara automatik Kod lapisan DAO setiap hari Di samping itu, kami hampir tidak perlu mengambil berat tentang cara mengendalikan permintaan serentak dalam pangkalan data, tetapi tiba-tiba suatu hari amaran pangkalan data MYSQL dan kebuntuan berlaku Kami panik dan tidak dapat membantu tertanya-tanya: Bukankah ini hanya pertanyaan biasa Masih terkunci?

Untuk mengelakkan ekspresi panik ditangkap oleh penyelia, kita perlu mengetahui terlebih dahulu kunci apa yang ada dalam pangkalan data.

Dalam MySQL, kunci sebenarnya terbahagi kepada dua kategori: jenis kunci (jenis_kunci) dan mod kunci (mod_kunci).

Jenis kunci menerangkan butiran kunci, iaitu, di mana kunci ditambahkan secara khusus dan mod kunci menerangkan jenis kunci yang ditambahkan, sama ada kunci baca atau kunci tulis. Mod kunci sering digunakan bersama-sama dengan jenis kunci.

Mengikut mod kunci

Baca kunci

Baca kunci, juga dipanggil kongsi kunci/S kunci/kongsi kunci .

Kunci baca ialah kunci yang dibuat oleh transaksi (seperti transaksi A) semasa menjalankan operasi baca (seperti membaca jadual atau membaca satu baris) Urus niaga lain boleh membaca data secara serentak (dikunci) , tetapi data tidak boleh diubah suai (melainkan pengguna yang memegang kunci telah melepaskan kunci).

Selepas transaksi A menambahkan kunci baca pada data, transaksi lain masih boleh menambah kunci baca (kongsi) padanya, tetapi tidak boleh menambah kunci tulis.

Menambah kunci baca pada rekod

InnoDB menyokong kunci meja dan kunci baris, mengunci baris (iaitu rekod), dan Daripada mengunci rekod, kunci indeks yang sepadan dengan rekod. Jika tiada indeks dalam keadaan di mana, semua rekod akan dikunci.

Pernyataan penguncian yang jelas ialah:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Nota: Bacaan yang disebut di sini merujuk kepada bacaan semasa dan bacaan syot kilat tidak memerlukan penguncian. Bacaan pilihan biasa biasanya adalah bacaan syot kilat, kecuali untuk pernyataan penguncian eksplisit seperti pilih...kunci dalam mod kongsi, yang akan menjadi bacaan semasa Di bawah tahap boleh bersiri enjin InnoDB, bacaan pilih biasa juga akan menjadi bacaan syot kilat.

Selain itu, perlu diingatkan bahawa analisis proses penguncian kunci baris mestilah berdasarkan tahap pengasingan transaksi, sama ada menggunakan indeks (jenis indeks yang mana), sama ada rekod itu wujud dan lain-lain faktor untuk menentukan tempat untuk menambahnya.

Beberapa situasi menambah kunci baca dalam enjin innodb

Pertanyaan biasa akan menambah kunci S pada rekod apabila tahap pengasingan boleh bersiri. Tetapi ini juga bergantung pada senario: bacaan bukan transaksi (komit automatik) tidak memerlukan penguncian pada tahap pengasingan Bersiri

Tahap pengasingan boleh bersiri: Jika keadaan pertanyaan ialah indeks unik dan nilai sama yang unik; pertanyaan: Tambahkan kunci S pada rekod; pertanyaan keadaan bukan unik (apabila pertanyaan mengimbas berbilang rekod): rekodkan jurang dalam rekod itu sendiri (perlu menganalisis julat jurang secara khusus), tambah kunci S

pilih ... dalam mod kongsi, kunci S akan ditambahkan pada rekod, tetapi gelagat mengunci akan berbeza bergantung pada tahap pengasingan:

Tahap pengasingan RC: Kunci S akan ditambahkan pada rekod . Tahap pengasingan RR/boleh bersiri: Jika syarat pertanyaan ialah indeks unik dan pertanyaan nilai sama yang unik: kunci S ditambahkan pada pertanyaan keadaan bukan unik (apabila pertanyaan mengimbas berbilang rekod): jurang antara rekod itu sendiri; (Perlu menganalisis julat jurang secara khusus), tambah kunci S

Biasanya operasi sisip tidak dikunci, tetapi jika kunci pendua dikesan semasa memasukkan atau mengemas kini rekod (atau terdapat pendua ditanda untuk pemadaman) kunci), untuk sisipan/kemas kini biasa, kunci S akan ditambah, dan untuk pernyataan SQL seperti ganti ke dalam atau sisipkan ... pada pendua, kunci X akan ditambah.

masukkan ... pilih Apabila memasukkan data, kunci S akan ditambahkan pada data yang diimbas pada jadual pilih

Semakan kunci asing: Apabila kami memadamkan rekod pada jadual induk, kami perlu Periksa sama ada terdapat kekangan rujukan Pada masa ini, rekod yang sepadan pada sub-jadual akan diimbas dan kunci S akan ditambah.

Menambah kunci baca pada meja

Kunci meja dilaksanakan oleh pelayan MySQL Kunci meja boleh digunakan tanpa mengira enjin storan. Secara amnya, apabila melaksanakan pernyataan DDL, seperti ALTER TABLE, seluruh jadual akan dikunci. Anda juga boleh mengunci jadual secara eksplisit apabila melaksanakan pernyataan SQL.

Pernyataan penguncian eksplisit untuk jadual ialah:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Apabila menggunakan enjin MYISAM, biasanya kita tidak perlu menguncinya secara manual, kerana enjin MYISAM akan menyasarkan kami Pernyataan sql dikunci secara automatik, dan keseluruhan proses tidak memerlukan campur tangan pengguna:

  • Pernyataan pertanyaan (pilih): Kunci baca akan ditambahkan secara automatik pada jadual yang terlibat

  • Kemas kini kenyataan (kemas kini, padam, sisip): Kunci tulis akan ditambah secara automatik pada jadual yang terlibat.

Tulis kunci

Tulis kunci, kunci eksklusif/kunci X/kunci eksklusif. Sifat menyekat kunci tulis adalah lebih ketat daripada kunci baca Selepas transaksi menambahkan kunci tulis pada data, transaksi lain tidak boleh membaca atau menukar data.

Julat yang sama seperti kunci baca dan kunci tulis boleh ditambahkan pada rekod atau jadual.

Menambah kunci tulis pada rekod

Menambah kunci tulis pada rekod, enjin perlu menggunakan InnoDB.

Biasanya penyata pilihan biasa tidak akan dikunci (kecuali apabila tahap pengasingan Boleh Diseri Jika anda ingin menambah kunci eksklusif semasa pertanyaan, anda perlu menggunakan pernyataan berikut:

Tambah tulis). kunci semasa pertanyaan:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Sama seperti menambah kunci baca, kunci tulis juga ditambahkan pada indeks.

Tambah kunci tulis semasa mengemas kini:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Tambah kunci tulis pada meja

Pernyataan yang secara eksplisit menambah kunci tulis pada jadual ialah:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Apabila enjin memilih myisam, pernyataan sisip/kemas kini/padam akan menambah kunci eksklusif pada jadual secara automatik .

Keserasian kunci baca-tulis:

  • Kunci baca dikongsi, ia tidak akan menyekat kunci baca yang lain, tetapi akan menyekat kunci tulis yang lain;

  • Kunci tulis adalah eksklusif, ia akan menyekat kunci baca yang lain dan kunci tulis;
  • Ringkasan: membaca dan membaca tidak saling eksklusif, membaca dan menulis adalah saling eksklusif, menulis Tulis mutex

Kunci niatKunci niat ialah kunci peringkat meja yang tidak bercanggah dengan baris- kunci aras , menunjukkan jenis kunci (kunci S atau InnoDB menyokong berbilang kunci butiran, membenarkan kewujudan bersama kunci peringkat baris dan kunci peringkat meja.

Kunci niat terbahagi kepada:

Kunci kongsi niat (kunci IS): Kunci IS menunjukkan bahawa transaksi semasa bercadang untuk menetapkan kunci kongsi pada baris dalam jadual

Apabila pernyataan berikut dilaksanakan Kunci IS akan diperoleh dahulu, kerana operasi ini memperoleh kunci S: Dapatkan kunci S: pilih ... kunci dalam mod kongsi

Kunci eksklusif niat (kunci IX) : Kunci IX menunjukkan bahawa niat transaksi semasa berada dalam jadual Tetapkan kunci eksklusif pada baris

Apabila pernyataan berikut dilaksanakan, kunci IX akan diperoleh terlebih dahulu, kerana operasi ini memperoleh kunci X : Memperoleh kunci X: pilih ... untuk kemas kini transaksi

untuk diperoleh Sebelum mendapatkan kunci S dan kunci X pada meja tertentu, kunci IS dan kunci IX yang sepadan mesti diperolehi masing-masing.

Apakah peranan kunci niat:

Jika transaksi lain mencuba kunci kongsi atau kunci eksklusif di peringkat jadual, ia tertakluk pada kunci niat peringkat jadual yang dikawal oleh transaksi pertama blok. Transaksi kedua tidak perlu menyemak kunci halaman atau baris individu sebelum mengunci jadual, tetapi hanya untuk kunci niat di atas meja.

Contoh: table test_user:

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQLTransaksi A memperoleh kunci eksklusif pada satu baris dan tidak melakukan;

Transaksi B ingin mendapatkan kunci kongsi jadual bagi jadual pengguna_pengujian; mesti memastikan:

Tiada transaksi lain pada masa ini memegang kunci eksklusif pada meja pengguna (kunci eksklusif meja).

  • Tiada transaksi lain yang memegang kunci eksklusif (kunci eksklusif baris) pada mana-mana baris dalam jadual pengguna pada masa ini.

  • Untuk menyemak sama ada syarat kedua dipenuhi, transaksi B mesti menyemak sama ada terdapat kunci eksklusif pada setiap baris dalam jadual sambil memastikan tiada kunci eksklusif pada pengguna_pengujian meja. Jelas sekali ini adalah pendekatan yang sangat tidak cekap, tetapi dengan kunci niat, situasinya berbeza:

  • Kerana transaksi A telah memperoleh dua kunci pada masa ini: kunci eksklusif niat dan id pada jadual pengguna Kunci eksklusif pada 28 data barisan.

Transaksi B ingin mendapatkan kunci kongsi jadual pengguna_pengujian:

Urus niaga B hanya perlu mengesan sama ada transaksi A memegang kunci eksklusif niat bagi jadual pengguna_pengujian, dan kemudian ia boleh mengetahui bahawa transaksi A mesti menahan Jika terdapat kunci eksklusif pada baris data tertentu dalam jadual, permintaan kunci transaksi B untuk jadual test_users akan dikecualikan (disekat), jadi tidak perlu mengesan sama ada terdapat kunci eksklusif pada setiap baris data dalam jadual.

Transaksi C juga ingin mendapatkan kunci eksklusif pada baris dalam jadual pengguna:

Transaksi C mengesan transaksi A memegang kunci eksklusif niat pada jadual pengguna_test ;

  • Kunci niat tidak saling eksklusif, jadi transaksi C memperoleh kunci eksklusif niat bagi jadual pengguna_pengujian; id ialah 31 Tiada kunci eksklusif, dan akhirnya transaksi C berjaya memperoleh kunci eksklusif pada baris data.

  • Kunci niat tidak saling eksklusif, tetapi terdapat tahap tertentu keserasian dan pengecualian bersama antara kunci niat dan kunci meja lain, seperti berikut:

    Eksklusiviti bersama yang serasi antara kunci niat:

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Eksklusiviti bersama antara kunci niat dan kunci eksklusif/kongsi biasa:

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Dalam enjin storan InnoDB, kaunter meningkat sendiri ditetapkan untuk setiap medan meningkat sendiri. Kita boleh melaksanakan penyataan berikut untuk mendapatkan nilai semasa pembilang ini:

    Apabila kita melakukan operasi sisipan, operasi akan berdasarkan nilai semasa bagi diri ini. meningkatkan kaunter. 1 operasi dan menetapkannya kepada lajur meningkat sendiri Operasi ini dipanggil Auto-inc Locking, iaitu kunci kenaikan automatik ini sebenarnya menggunakan mekanisme kunci meja jika operasi sisipan berlaku , ini Kunci dilepaskan serta-merta selepas operasi sisipan selesai, dan bukannya menunggu transaksi dilakukan.

    Mengikut jenis kunci

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Kunci global

    Apa yang dipanggil kunci global sebenarnya mengunci keseluruhan contoh pangkalan data .

    Terdapat perbezaan antara contoh pangkalan data dan pangkalan data: Pangkalan data ialah gudang yang menyimpan data Secara khusus dalam mysql, pangkalan data sebenarnya adalah koleksi fail data (iaitu apa biasa kita panggil database, contohnya statement untuk create database ialah create database...).

    Instance pangkalan data merujuk kepada aplikasi yang mengakses pangkalan data Dalam Mysql, ia adalah proses mysqld.

    Ringkasnya, tika pangkalan data mengandungi pelbagai pangkalan data yang anda buat.

    Jika anda menambah kunci global pada contoh pangkalan data, keseluruhan perpustakaan akan berada dalam keadaan baca sahaja (ini sangat berbahaya).

    Secara umumnya, senario penggunaan tipikal kunci global adalah untuk sandaran pangkalan data penuh, iaitu, untuk memilih semua jadual dalam pangkalan data. Walau bagaimanapun, ambil perhatian bahawa membiarkan keseluruhan pustaka dalam keadaan baca sahaja akan menyebabkan beberapa masalah serius:

    Tambah kunci global pada pustaka utama Semasa tempoh kunci, tiada operasi kemas kini boleh dilaksanakan, banyak fungsi perniagaan pada dasarnya tidak tersedia; menyebabkan kelewatan penyegerakan tuan-hamba.

    Pernyataan penguncian kunci global ialah:
    • Kaedah melepaskan kunci global ialah:
    • Cukup putuskan sambungan sesi yang melaksanakan kunci global; Jika anda memerlukan pangkalan data Untuk sandaran, anda boleh menggunakan alat sandaran logik rasmi mysqldump.

    Memandangkan kita sudah mempunyai alat dump, mengapa kita memerlukan FTWRL? Bacaan yang konsisten adalah baik, tetapi hanya jika enjin menyokong tahap pengasingan ini. Contohnya, enjin seperti MyISAM tidak menyokong transaksi. Pada masa ini, kita perlu menggunakan arahan FTWRL.

    Jika ada bacaan atau tulisan sebelum FTWRL, FTWRL akan menunggu bacaan dan penulisan selesai sebelum melaksanakan. Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Apabila FTWRL dilaksanakan, data halaman yang kotor mesti dibuang ke cakera Kerana konsistensi data mesti dikekalkan, FTWRL dilaksanakan apabila semua transaksi diserahkan.

    Pelaksanaan kunci global masih bergantung pada kunci metadata.
    • Kunci Metadata
    • Kunci MetaData, juga dipanggil kunci MDL, digunakan untuk melindungi maklumat metadata pada peringkat sistem Kunci tidak boleh dikawal secara aktif . Dalam MySQL versi 5.5, kunci MDL telah diperkenalkan, terutamanya untuk mengekalkan ketekalan metadata di bawah operasi serentak DDL dan DML dalam persekitaran serentak. Contohnya, situasi berikut:
    Tahap pengasingan: RR

    Jika tiada perlindungan kunci metadata, maka transaksi 2 boleh terus melaksanakan operasi DDL, mengakibatkan ralat transaksi 1. Kunci MDL telah ditambahkan dalam versi MYSQL5.5 untuk melindungi situasi ini daripada berlaku. Oleh kerana transaksi 1 memulakan pertanyaan, ia memperoleh kunci metadata Mod kunci ialah kunci baca MDL Jika transaksi 2 ingin melaksanakan DDL, ia perlu mendapatkan kunci tulis MDL Memandangkan kunci baca dan tulis adalah saling eksklusif, transaksi 2 perlu menunggu transaksi 1 dikeluarkan. Ia hanya boleh dilaksanakan jika kunci baca dilepaskan.

    Apabila menambah, memadam, mengubah suai dan menyemak rekod dalam jadual (operasi DML), kunci baca MDL ditambah secara automatik; struktur jadual (operasi DDL) Apabila membuat pengubahsuaian, kunci tulis MDL ditambah secara automatik.

    Kebutiran kunci MDL

    Kunci MDL dilaksanakan pada peringkat pelayan Mysql, bukan dalam palam enjin storan -dalam direalisasikan dalam. Mengikut skop penguncian, kunci MDL boleh dibahagikan kepada kategori berikut:

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Mod kunci MDL

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Kunci tahap halaman

    Kunci dalam MySQL dengan butiran kunci antara kunci peringkat baris dan kunci peringkat meja. Kunci peringkat jadual adalah pantas tetapi mempunyai banyak konflik Kunci peringkat baris mempunyai sedikit konflik tetapi perlahan. Jadi kami mengambil tahap halaman yang terjejas dan mengunci sekumpulan rekod bersebelahan pada satu masa. Enjin storan yang berbeza menyokong mekanisme penguncian yang berbeza. Menurut enjin storan yang berbeza, ciri-ciri kunci dalam MySQL boleh diringkaskan secara kasar seperti berikut:

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Penguncian peringkat halaman ialah tahap penguncian unik dalam MySQL dan digunakan pada Enjin BDB. Konkurensi adalah purata Ciri penguncian peringkat halaman ialah butiran penguncian adalah antara penguncian peringkat baris dan penguncian peringkat meja Oleh itu, overhed sumber yang diperlukan untuk mendapatkan kunci dan keupayaan pemprosesan serentak yang boleh disediakan juga antara dua di atas. Selain itu, penguncian peringkat halaman dan penguncian peringkat baris akan menyebabkan kebuntuan.

    Perbandingan butiran penguncian: kunci peringkat jadual> kunci peringkat baris

    kunci peringkat meja

    Kunci meja telah diperkenalkan di atas Berbanding dengan penguncian berbutir halus kunci baris, kunci meja mengunci keseluruhan meja. Memandangkan keseluruhan jadual dikunci, ia tidak rumit seperti mengunci baris, jadi mengunci lebih cepat daripada mengunci baris, dan tidak akan ada jalan buntu (kerana transaksi memperoleh kunci meja yang diingini pada satu masa ), tetapi kunci meja juga mempunyai beberapa masalah: julat kunci terlalu besar, dan apabila konkurensi agak tinggi, kebarangkalian konflik kunci akan meningkat, yang akan mengurangkan prestasi konkurensi.

    Kaedah mengunci kunci meja

    Apabila enjin memilih MYISAM

    Enjin MYISAM hanya menyokong kunci meja, bukan Kunci baris.

    Pernyataan untuk menambah kunci peringkat meja secara manual adalah seperti berikut:

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Apabila menggunakan enjin MYISAM, biasanya kita tidak perlu menambah kunci secara manual, kerana enjin MYISAM akan menyasarkan kita Pernyataan sql dikunci secara automatik, dan keseluruhan proses tidak memerlukan campur tangan pengguna:

    • Pernyataan pertanyaan (pilih): Kunci baca akan ditambah secara automatik pada jadual yang terlibat;

    • Kemas kini kenyataan (kemas kini, padam, sisip): Kunci tulis akan ditambah secara automatik pada jadual yang terlibat

    Apabila enjin memilih InnoDB

    Enjin InnoDB menyokong kedua-dua kunci peringkat baris dan kunci peringkat meja, dan lalai ialah kunci peringkat baris.

    Kunci jadual secara manual dalam enjin InnoDB, dan juga gunakan penyataan baca/tulis jadual kunci {tableName} untuk menambah kunci baca/tulis.

    Selain itu, innodb juga menyokong kunci peringkat jadual: kunci niat (sudah diperkenalkan di atas).

    Secara amnya, kunci peringkat jadual enjin InnoDB termasuk lima mod kunci:

    • LOCK_IS: Menunjukkan kunci baca

    • LOCK_IX: Menunjukkan niat untuk menulis kunci

    • LOCK_S: Kunci baca meja

    • LOCK_X: Kunci tulis meja

    • LOCK_AUTO_INC: Kunci kenaikan automatik

    Kunci peringkat baris

    Dalam proses menulis kod perniagaan , yang paling sering kami temui ialah kunci peringkat baris (kunci peringkat jadual biasanya tidak disyorkan kerana isu prestasi). Berbanding dengan kunci peringkat jadual, kunci peringkat baris mempunyai kelebihan prestasi yang jelas:

    • Konflik yang lebih sedikit: Terdapat hanya beberapa konflik penguncian apabila mengakses rekod yang berbeza dalam berbilang rangkaian

    • Kebutiran kunci adalah kecil: satu baris boleh dikunci untuk masa yang lama tanpa menjejaskan baris lain, jadi konkurensi adalah yang tertinggi; kunci baris Jika anda tidak berhati-hati, kebuntuan sangat mudah berlaku (kunci meja tidak wujud untuk kebuntuan), jadi apabila menggunakan kunci baris, anda perlu memberi perhatian kepada susunan penguncian dan julat penguncian.

    • Kunci baris InnoDB dilaksanakan dengan mengunci item indeks, yang bermaksud kunci baris hanya akan digunakan apabila menanya rekod melalui indeks Jika data ditanya tanpa indeks, kunci jadual akan digunakan dan prestasi akan sangat berkurangan.

    Anda perlu ingat: kunci baris juga dipanggil kunci rekod dan kunci rekod ditambahkan pada indeks.

    di mana keadaan menentukan indeks kunci utama: kemudian kunci indeks kunci utama

    • keadaan yang menentukan indeks kedua: rekod Kunci akan; bukan sahaja ditambahkan pada indeks sekunder ini, tetapi juga kepada indeks berkelompok yang sepadan dengan indeks sekunder ini; ditambahkan pada semua baris data dalam jadual, dan lapisan enjin storan mengembalikan semua rekod ke pelayan MySQL untuk penapisan.

    • Kunci rekod: LOCK_REC_NOT_GAP (kunci rekod sahaja)
    • Kunci rekod ialah kunci baris yang paling mudah. Sebagai contoh, pada tahap pengasingan RR, apabila melaksanakan pilih * dari t_user di mana id = 1 untuk penyataan kemas kini, rekod id = 1 (di mana id ialah kunci utama) sebenarnya dikunci (kunci ditambah pada indeks berkelompok) .

    Kunci rekod sentiasa ditambahkan pada indeks Walaupun jadual tidak mempunyai indeks, pangkalan data akan membuat indeks secara tersirat. Jika lajur yang dinyatakan dalam keadaan WHERE ialah indeks sekunder, kunci rekod bukan sahaja akan ditambahkan pada indeks sekunder, tetapi juga pada indeks berkelompok yang sepadan dengan indeks sekunder.

    Perhatikan bahawa jika pernyataan SQL tidak boleh menggunakan indeks, ia akan menggunakan indeks utama untuk mengimbas keseluruhan jadual Pada masa ini, MySQL akan menambah kunci rekod pada semua baris data dalam keseluruhan jadual.

    Jika keadaan WHERE tidak dapat ditapis dengan cepat oleh indeks, lapisan enjin storan akan mengunci semua rekod dan mengembalikannya, dan kemudian lapisan Pelayan MySQL akan menapisnya. Apabila tiada indeks, ia bukan sahaja akan menggunakan banyak sumber kunci dan meningkatkan overhed pangkalan data, tetapi juga mengurangkan prestasi konkurensi pangkalan data Oleh itu, anda mesti ingat untuk menggunakan indeks semasa operasi kemas kini (kerana operasi kemas kini akan menambah kunci X).

    Beberapa jenis kunci peringkat baris:

    Kunci celah: LOCK_GAP (hanya mengunci celah)

    Kunci celah ialah Kunci jarak. Kunci ditambahkan pada ruang kosong yang tidak wujud, atau di antara dua rekod indeks, atau rekod indeks pertama, atau ruang selepas indeks terakhir Ia digunakan untuk menunjukkan bahawa hanya julat dikunci (biasanya dalam pengasingan apabila melakukan julat pertanyaan) tahap dalam RR atau selang Bersiri).

    Kunci GAP biasanya digunakan di bawah tahap pengasingan RR. Tujuan utama menggunakan kunci GAP adalah untuk mengelakkan bacaan hantu Dalam selang yang dikunci oleh kunci GAP, data tidak dibenarkan untuk dimasukkan atau dikemas kini.

    Syarat penjanaan kunci jurang: Tahap pengasingan innodb ialah Bacaan Boleh Berulang atau Boleh Bersiri.

    Penerangan tentang skop kunci jurang:

    Tahap pengasingan: RR

    Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL

    Menggunakan jadual Pelajar sebagai data sampel, id ialah kunci utama. stu_code ialah nombor pelajar dan menambah indeks biasa.

    Takrifan kawasan kunci jurang:

    Pandang ke kiri untuk nilai A yang paling hampir sebagai selang kiri mengikut keadaan carian, dan cari nilai B yang paling hampir ke kanan sebagai selang kanan . Kunci celah ialah ( A, B)

    Nilai terdekat A tidak boleh ditemui di sebelah kiri, iaitu sangat kecil Sebagai selang kiri, nilai terdekat B ditemui di sebelah kanan , kunci jurang ialah (saiz kecil, B)

    Cari nilai terdekat A ke kiri sebagai selang kiri, dan cari nilai B terdekat ke kanan, iaitu infiniti Sebagai selang kanan, jurang kunci ialah (A, infiniti)

    selang (A,B) Contoh:

    Transaksi 1:

    select * from student where stu_code = 4 for update
    Salin selepas log masuk

    Transaksi 2:

    insert into student vaues(2, 2, 'A');
    insert into student values(4, 5, 'B');
    Salin selepas log masuk

    Menurut analisis pernyataan SQL transaksi 1, skop kunci jurang ialah : Rekod stu_code = 4 wujud, jadi nilai indeks terkini dalam selang kiri ialah stu_code = 3, dan nilai indeks terkini di sebelah kanan selang ialah stu_code = 7, jadi julat jurang ialah: (3, 7), jadi dua urus niaga transaksi 2 Terdapat dua penyata sisipan, satu di luar julat dan satu dalam julat boleh disisipkan. manakala yang dalam julat disekat, jadi (2, 2, 'A') boleh dimasukkan dengan jayanya;

    Selang waktu (kecil tak terhingga, B) contoh:

    Transaksi 1:

    select * from student where stu_code = 1 for update
    Salin selepas log masuk

    Transaksi 2:

    insert into student vaues(2, 0, 'c');
    insert into student vaues(2, 2, 'r');
    insert into student vaues(5, 2, 'o');
    Salin selepas log masuk

    Mengikut pernyataan sql daripada analisis transaksi 1, julat kunci jurang ialah: stu_code = 1 wujud, tiada rekod terkini di sebelah kiri, jadi ia adalah sangat kecil di sebelah kiri, dan nilai indeks terdekat di sebelah kanan ialah stu_code = 3, jadi julat kunci jurang ialah: (tak terhingga, 3). Oleh itu, pelaksanaan penyata sisipan sql pertama dan kedua bagi transaksi 2 disekat dan berada dalam skop kunci jurang. Penyataan sql sisipan ketiga boleh dilaksanakan dengan jayanya dan tidak berada dalam julat kunci jurang.

    Contoh Interval (A, infiniti):

    Transaksi 1:

    select * from student where stu_code = 7 for update
    Salin selepas log masuk

    Transaksi 2:

    insert into student vaues(2, 2, 'm');
    insert into student vaues(20, 22, 'j');
    Salin selepas log masuk
    Salin selepas log masuk

    Mengikut pernyataan sql bagi Analisis transaksi 1, julat kunci jurang ialah: stu_code = 7 wujud, nilai indeks terdekat di sebelah kiri ialah stu_code = 4, dan tiada nilai indeks di sebelah kanan, jadi julat kunci jurang ialah: (4, infiniti ), sisipan pertama Pernyataan boleh dilaksanakan dengan jayanya, tetapi ia tidak berada dalam julat jurang;

    Jika pernyataan pertanyaan tidak direkodkan dalam pangkalan data, bagaimana untuk menguncinya?

    Pertanyaan di atas direkodkan Jika pernyataan pertanyaan tidak direkodkan dalam pangkalan data, bagaimana untuk menguncinya? Mari teruskan:

    Transaksi 1:

    update student set stu_name = '000' where stu_code = 10
    Salin selepas log masuk

    Transaksi 2:

    insert into student vaues(2, 2, 'm');
    insert into student vaues(20, 22, 'j');
    Salin selepas log masuk
    Salin selepas log masuk

    Menurut pernyataan pelaksanaan di atas, rekod tidak dapat ditemui, jadi ambil ke kiri Rekod terkini (10, 7, 'Xiao Ming') digunakan sebagai selang kiri, iaitu, julat kunci jurang ialah: (7, infiniti Pernyataan sisipan pertama tidak berada dalam julat selang dan boleh dilaksanakan dengan jayanya; pernyataan pelaksanaan sisipan kedua adalah dalam Selang disekat dan pelaksanaan gagal. Jika keadaan di mana transaksi 1 lebih besar daripada 10, nilai rekod terdekat juga ditemui di sebelah kiri sebagai selang kiri, jadi julat kunci jurang juga: (7, infiniti)

    Ringkasan: Syarat untuk penjanaan kunci jurang

    Di bawah tahap pengasingan RR/Boleh Bersiri: Pilih... Di mana...Untuk Kemas Kini:

    Apabila hanya menggunakan pertanyaan indeks unik dan mengunci hanya satu rekod, InnoDB akan menggunakan kunci baris.

    Apabila hanya pertanyaan indeks unik digunakan, tetapi keadaan carian ialah carian julat, atau hasil carian ialah carian unik tetapi tidak wujud (cuba mengunci data yang tidak wujud), Next-Key Lock akan berlaku.

    Apabila menggunakan carian indeks biasa, tidak kira apa jenis pertanyaannya, selagi ia dikunci, kunci celah akan dijana.

    Apabila menggunakan indeks unik dan indeks biasa pada masa yang sama, memandangkan baris data diisih dahulu mengikut indeks biasa dan kemudian mengikut indeks unik, kunci jurang juga akan berlaku.

    Kunci Kekunci Seterusnya: LOCK_ORDINARY, juga dikenali sebagai Kunci Kekunci Seterusnya

    Kunci Kekunci Seterusnya ialah gabungan kunci jurang kunci rekod . Seperti kunci celah, tiada kunci kekunci Seterusnya di bawah tahap pengasingan RC (melainkan ia dihidupkan secara paksa dengan mengubah suai konfigurasi), hanya tahap pengasingan RR/Boleh Bersiri.

    MySQL InnoDB berfungsi di bawah tahap pengasingan baca berulang (RR), dan akan mengunci baris data menggunakan Next-Key Lock, yang boleh menghalang berlakunya bacaan hantu dengan berkesan. Kunci Kekunci Seterusnya ialah gabungan kunci baris dan kunci jurang Apabila InnoDB mengimbas rekod indeks, ia akan menambah kunci baris (Kunci Rekod) pada rekod indeks, dan kemudian menambah kunci jurang (Kunci Jurang) pada jurang. pada kedua-dua belah rekod indeks. Selepas menambah kunci jurang, transaksi lain tidak boleh mengubah suai atau memasukkan rekod dalam jurang ini.

    Apabila indeks yang ditanya mengandungi atribut unik (indeks unik, indeks kunci utama), enjin storan Innodb akan mengoptimumkan kunci kekunci seterusnya dan mengurangkannya kepada kunci rekod, iaitu, hanya mengunci indeks itu sendiri. daripada skop.

    Masukkan kunci niat: LOCK_INSERT_INTENSION

    Masukkan kunci niat, yang digunakan semasa memasukkan rekod. Kunci ini mewakili niat memasukkan Kunci ini hanya akan wujud apabila pernyataan sisipan dilaksanakan.

    Anggapkan bahawa nilai rekod indeks masing-masing ialah id = 1 dan id = 5 (tiada rekod antara 1 dan 5, cuba masukkan id = 2 dan id = 3 masing-masing mendapatkan baris yang dimasukkan Sebelum kunci eksklusif, setiap transaksi menggunakan kunci niat sisipan untuk mengunci ruang antara 1 dan 5, tetapi tidak akan menyekat satu sama lain. Kerana tidak akan ada konflik antara kunci niat yang dimasukkan.

    Kunci niat sisipan akan bercanggah dengan kunci jurang atau Kunci Kekunci Seterusnya: fungsi kunci jurang adalah untuk mengunci selang untuk menghalang transaksi lain daripada memasukkan data dan menyebabkan bacaan hantu.

    Dalam senario di atas, dengan mengandaikan bahawa transaksi A telah memperoleh kunci jurang dengan id dalam julat (1, 5) terlebih dahulu, maka apabila transaksi B cuba memasukkan id = 2, ia akan mula-mula cuba memperoleh kunci niat sisipan, tetapi Disebabkan konflik antara kunci niat sisipan dan kunci jurang, sisipan gagal, sekali gus mengelakkan berlakunya bacaan hantu.

    Kesimpulan

    Mekanisme penguncian MYSQL sangat kompleks Dalam kerja pembangunan sebenar, anda perlu berhati-hati dalam menetapkan tahap pengasingan, seperti kerana Tahap RR akan mempunyai satu lagi kunci jurang daripada tahap RC, yang mungkin menyebabkan masalah prestasi yang serius. Artikel ini secara ringkas memperkenalkan klasifikasi kunci MYSQL dari perspektif mod kunci dan skop kunci Saya berharap dalam proses pembangunan pangkalan data, kita boleh menganalisis dan mengkaji dengan teliti sama ada pernyataan SQL kami adalah munasabah (terutamanya memberi perhatian kepada sama ada kebuntuan dan lain-lain. isu akan berlaku) )!

    Pembelajaran yang disyorkan: tutorial video mysql

Atas ialah kandungan terperinci Mari kita bincangkan tentang pelbagai mod dan jenis kunci dalam MYSQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.im
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan