Artikel ini membawa anda pengetahuan yang berkaitan tentang mysql, yang terutamanya memperkenalkan isu berkaitan tentang kunci global mengunci seluruh pangkalan data. Selepas kita menambah kunci baca pada pangkalan data, tiada permintaan lain boleh menambah kunci tulis pada pangkalan data Mari kita lihat bersama-sama saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: tutorial video mysql
Niat asal reka bentuk pangkalan data adalah untuk menangani isu konkurensi, sebagai sumber yang dikongsi oleh berbilang pengguna Apabila akses serentak berlaku, pangkalan data perlu mengawal peraturan capaian sumber secara munasabah. Kunci ialah struktur data penting yang digunakan untuk melaksanakan peraturan akses ini.
Mari kita siarkan dahulu gambar rajah klasifikasi umum kunci
Mengikut skop penguncian, kunci dalam MySQL boleh dibahagikan secara kasar kepada kunci global dan kunci meja, kunci baris. Kami akan mempelajari jenis kunci ini terlebih dahulu Dalam artikel ini, kami akan mempelajari tentang kunci global.
Kunci global mengunci seluruh pangkalan data. Selepas kami menambah kunci baca pada pangkalan data, tiada permintaan lain boleh menambah kunci tulis pada pangkalan data Apabila kami menambah kunci tulis pada pangkalan data, tiada permintaan seterusnya boleh menambah kunci baca atau tulis pada pangkalan data.
MySQL menyediakan kaedah untuk menambah kunci baca global, Siram jadual dengan kunci baca (FTWRL). Apabila kita perlu membuat keseluruhan perpustakaan dalam keadaan baca sahaja, kita boleh menggunakan arahan ini Kemudian penyataan berikut bagi utas lain akan disekat: penyata kemas kini data (tambah, padam, ubah suai), penyataan definisi data (termasuk membuat jadual. , mengubah suai struktur jadual, dsb.) dan mengemas kini Penyataan komit untuk transaksi kelas.
Senario penggunaan kunci global: Buat sandaran logik bagi keseluruhan pangkalan data. Sandaran logik bermakna memilih setiap jadual dalam keseluruhan pangkalan data dan menyimpannya sebagai teks. Maksudnya, kunci global hanya digunakan apabila melaksanakan data sandaran tuan-hamba atau mengimport dan mengeksport data.
Oleh kerana apabila kami membuat sandaran data atau mengimport dan mengeksport data, jika data boleh ditambah, dipadam dan diubah suai pada masa yang sama dalam tempoh ini, ketidakkonsistenan data akan berlaku.
Pada masa lalu, terdapat cara untuk menggunakan FTWRL yang dinyatakan di atas untuk memastikan bahawa tiada urutan lain akan mengemas kini pangkalan data semasa sandaran Nota: Semasa proses sandaran, keseluruhan pustaka berada dalam baca sahaja negeri.
Oleh kerana kunci global berorientasikan pangkalan data ini, menambah kunci global berbunyi sangat berbahaya:
Memandangkan penambahan kunci global mempunyai kesan yang begitu besar, bolehkah kita mengelak daripada mengunci?
Melalui pengenalan di atas, kita tahu bahawa penguncian adalah untuk menyelesaikan masalah ketidakkonsistenan data. Jadi selagi kami dapat menyelesaikan masalah ketidakkonsistenan data, kami tidak perlu menambah kunci global. Terdapat idea sedemikian: jika kita merekodkan log operasi apabila kita memulakan sandaran data, penambahan, pemadaman, pengubahsuaian dan pertanyaan kepada pangkalan data dibenarkan tanpa mengunci semasa proses sandaran, dan semasa proses sandaran, rekod operasi penambahan, pemadaman. , pengubahsuaian dan pertanyaan direkodkan dalam satu Dalam fail log, selepas sandaran kami selesai, kami akan melaksanakan semua operasi dalam fail log dalam tempoh ini. Ini memastikan ketekalan data sebelum dan selepas sandaran.
Untuk meringkaskan, tanpa mengunci, data sandaran dan data utama tidak berada pada titik masa yang logik, dan pandangan ini secara logiknya tidak konsisten. Jika kita memastikan bahawa titik masa logik adalah konsisten, iaitu pandangan logik adalah konsisten, kita boleh memastikan konsistensi data Daripada ini, kita memikirkan tahap pengasingan transaksi yang kita pelajari sebelum ini pandangan yang konsisten.
Terdapat mekanisme dalam InnoDB, enjin lalai MySQL, untuk memastikan ketekalan data. Enjin InnoDB mempunyai fungsi versi syot kilat Fungsi ini dipanggil MVCC kerana MVCC mengekalkan syot kilat versi sejarah Setiap syot kilat sepadan dengan nombor versi transaksi, kami akan memohon nombor versi transaksi mengambil data, anda hanya perlu membaca data dengan nombor versi transaksi yang lebih kecil daripada anda sendiri.
Alat sandaran logik rasmi ialah mysqldump. Apabila mysqldump menggunakan parameter –single-transaction, transaksi akan dimulakan sebelum mengimport data untuk memastikan paparan yang konsisten diperoleh. Disebabkan sokongan MVCC, data boleh dikemas kini seperti biasa semasa proses ini.
Fungsi parameter --single-transaction adalah untuk menetapkan tahap pengasingan urus niaga kepada bacaan berulang, iaitu BACA BOLEH DIULANG Ini memastikan semua pertanyaan yang sama dalam transaksi membaca data yang sama, yang secara kasarnya menjamin bahawa dalam Semasa pembuangan, jika benang enjin InnoDB lain mengubah suai data jadual dan menyerahkannya, ia tidak akan memberi kesan kepada data benang pembuangan.
Dan tetapkan DENGAN GAMBAR KONSISTEN ke tahap gambar. Bayangkan jika ia hanya bacaan berulang, maka apabila data tidak dibuang pada permulaan transaksi, utas lain mengubah suai dan menyerahkan data, maka hasil pertanyaan pertama pada masa ini adalah hasil yang dihantar oleh utas lain, dan DENGAN GAMBAR YANG KONSISTEN boleh memastikan bahawa apabila urus niaga dimulakan, hasil pertanyaan pertama ialah data A pada permulaan transaksi Walaupun urutan lain mengubah suai datanya kepada B pada masa ini, hasil pertanyaan itu masih A .
Kaedah transaksi tunggal hanya terpakai kepada perpustakaan yang menggunakan enjin transaksi untuk semua jadual. Dalam proses mysqldump, menambah --single-transaction boleh memastikan data InnoDB benar-benar konsisten Untuk enjin seperti MyISAM yang tidak menyokong transaksi, jika terdapat kemas kini semasa proses sandaran, hanya data terkini yang boleh diperolehi Ini memusnahkan konsistensi sandaran. Pada masa ini, kunci global masih diperlukan, jadi kita masih perlu menggunakan arahan FTWRL.
Kami mungkin juga mempunyai soalan ini, memandangkan keseluruhan perpustakaan adalah baca sahaja, mengapa kita tidak menggunakan set baca sahaja global = benar?
Memang benar kaedah baca sahaja juga boleh meletakkan keseluruhan perpustakaan ke dalam keadaan baca sahaja, tetapi masih disyorkan untuk menggunakan kaedah FTWRL, terutamanya atas dua sebab:
Selepas menetapkan keseluruhan perpustakaan kepada baca sahaja, jika pengecualian berlaku pada klien, pangkalan data akan kekal dalam keadaan baca sahaja, yang akan menyebabkan keseluruhan perpustakaan berada dalam keadaan tidak boleh ditulis untuk masa yang lama , dengan risiko yang tinggi.
Pembelajaran yang disyorkan: tutorial video mysql
Atas ialah kandungan terperinci Mari bercakap tentang kunci global MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!