Rumah  >  Artikel  >  pangkalan data  >  Artikel untuk membincangkan tentang kunci niat sisipan dalam MySQL

Artikel untuk membincangkan tentang kunci niat sisipan dalam MySQL

青灯夜游
青灯夜游asal
2022-12-21 20:56:302179semak imbas

Dalam artikel ini, kita akan bercakap tentang kunci niat sisipan dalam MySQL dan memperkenalkan apakah kunci niat sisipan? Mengapa saya perlu memasukkan kunci niat? Semoga ia membantu semua orang!

Artikel untuk membincangkan tentang kunci niat sisipan dalam MySQL

Masukkan Kunci Niat, kami juga memanggilnya kunci niat sisipan dalam bahasa Cina.

Ini boleh dikira sebagai tambahan kepada Gap Lock yang kami bincangkan sebelum ini, jika anda masih tidak faham, anda boleh rujuk: Record Lock, Gap Lock dan Next-. Kunci Kekunci.

1. Mengapa kita perlu memasukkan kunci niat

Kami sudah mempunyai Gap Lock sebelum ini boleh membantu kami menyelesaikan masalah bacaan hantu. Walau bagaimanapun, sebelum ini Nampaknya ada beberapa masalah.

Andaikan saya mempunyai jadual berikut:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) NOT NULL,  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

id ialah kunci utama yang ditambah secara automatik. Kini terdapat data berikut dalam jadual:

Andaikan saya ingin melaksanakan SQL sisipan berikut:

begin;insert into user(username,age) values('wangwu',95);

Perhatikan bahawa SQL ini dilaksanakan tetapi transaksi belum dilakukan.

Mengikut pengetahuan yang kami pelajari tentang Gap Lock sebelum ini, julat Gap Lock pada masa ini ialah (89,99), yang bermaksud tiada umur dalam julat ini boleh dimasukkan.

Jika ini berlaku, rakan-rakan akan mendapati bahawa kecekapan pemasukan data adalah terlalu rendah, dan konflik kunci cenderung berlaku. Jadi apa yang perlu kita lakukan?

Kunci niat sisipan yang akan kami perkenalkan hari ini digunakan untuk menyelesaikan masalah ini.

2. Apakah itu kunci niat sisipan?

Mari lihat pengenalan di laman web rasmi MySQL: kunci jurang yang ditetapkan oleh operasi INSERT sebelum baris sisipan. Kunci ini menandakan niat untuk memasukkan sedemikian rupa sehingga berbilang transaksi yang memasukkan ke dalam jurang indeks yang sama tidak perlu menunggu satu sama lain jika mereka tidak memasukkan pada kedudukan yang sama dalam jurang ​dari 4 dan 7. Asingkan transaksi yang cuba memasukkan nilai 5 dan 6, masing-masing, mengunci jurang antara 4 dan 7 dengan memasukkan kunci niat sebelum mendapatkan kunci eksklusif pada baris yang dimasukkan, tetapi jangan sekat setiap lain kerana baris tidak bercanggah.

Terjemahan kasarnya ialah:

Kunci niat sisipan ialah jurang yang ditetapkan sebelum Kunci operasi INSERT, kunci niat sisipan mewakili niat sisipan, iaitu, apabila berbilang transaksi yang berbeza memasukkan data ke dalam jurang yang sama indeks yang sama pada masa yang sama, mereka tidak perlu menunggu satu sama lain, iaitu, mereka tidak akan menyekat (jika anda hanya mengikut Mengikut kunci jurang sebelumnya teori, anda mesti menunggu kunci jurang dikeluarkan sebelum transaksi seterusnya boleh memasukkan data ke dalam jurang yang sama). Katakan terdapat rekod indeks dengan nilai 4 dan 7. Kini terdapat dua transaksi cuba memasukkan rekod dengan nilai 5 dan 6 masing-masing Setiap transaksi menggunakan kunci niat sisipan untuk mengunci antara 4 dan 7 sebelum mendapatkan kunci eksklusif baris yang disisipkan, tetapi kedua-dua transaksi tidak akan menyekat satu sama lain kerana baris tidak bercanggah.

Ini adalah untuk memasukkan kunci niat.

3. Berlatih

Rakan-rakan, sila ambil perhatian bahawa Brother Song bercakap tentang Gap Lock dengan semua orang sebelum ini dan mengatakan bahawa ini adalah di bawah tahap pengasingan REPEATABLE READ produk, jadi kini Insert Intention Lock ialah Kunci Jurang khas, yang sudah tentu juga berkuat kuasa di bawah tahap pengasingan bacaan berulang.

Seterusnya, kami akan menggunakan dua kes mudah untuk menunjukkan memasukkan kunci niat.

3.1 Kes 1

Struktur jadual dan data kami konsisten dengan bahagian pertama.

Mula-mula kami melaksanakan kod berikut dalam sesi A:

Sekarang transaksi dalam sesi A tidak dilakukan.

Seterusnya, kami juga melakukan operasi sisipan dalam sesi B:

Kami mendapati sesi B juga boleh dilaksanakan seperti biasa tanpa menyekat.

Ini menunjukkan bahawa dua kunci niat sisipan adalah serasi dan boleh wujud bersama.

3.2 Kes 2

Mari kita lihat contoh lain yang tidak serasi.

Mula-mula laksanakan pertanyaan SQL berikut dalam sesi A untuk menanyakan rekod dengan umur lebih daripada 80 tahun dan tambahkan kunci eksklusif:

Seterusnya dalam sesi B, laksanakan yang berikut Kod memasukkan baris data:

Kawan, anda boleh lihat bahawa operasi ini akan disekat! Sebab untuk menyekat ialah kunci niat sisipan dan kunci eksklusif adalah saling eksklusif.

Semasa penyekatan berlaku, dalam sesi C, kami menggunakan perintah show engine innodb statusG yang digunakan dalam artikel sebelumnya untuk menyemak situasi penguncian, memfokuskan pada nod TRANSAKSI:

Dalam kandungan output, tempat di mana kotak merah dipilih jelas menunjukkan kewujudan kunci niat sisipan.

4. Ringkasan

Untuk meringkaskan:

  • Masukkan kunci niat, sebenarnya Ia adalah kunci celah khas.

  • Kunci niat sisipan tidak saling eksklusif.

  • Sisipkan pengecualian bersama antara kunci niat dan kunci eksklusif.

Baiklah, jika anda mempunyai sebarang pertanyaan, sila tinggalkan mesej untuk perbincangan.

[Cadangan berkaitan: tutorial video mysql]

Atas ialah kandungan terperinci Artikel untuk membincangkan tentang kunci niat sisipan dalam MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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