Rumah  >  Artikel  >  pangkalan data  >  Pelaksanaan khusus penguncian optimistik dan penguncian pesimis dalam MySQL

Pelaksanaan khusus penguncian optimistik dan penguncian pesimis dalam MySQL

WBOY
WBOYke hadapan
2022-09-07 14:23:172601semak imbas

Pembelajaran yang disyorkan: tutorial video mysql

Untuk penguncian optimistik dan penguncian pesimis dalam MySQL, ramai pembangun mungkin belum mengetahuinya. , tetapi tidak tahu bagaimana ia dilaksanakan. Artikel ini akan memberikan demonstrasi kes praktikal mengenai isu ini supaya anda dapat memahami sepenuhnya perbezaan antara dua kunci.

Klasifikasi kunci

Kunci MySQL terutamanya dibahagikan kepada kunci jadual, kunci baris dan kunci halaman mengikut skopnya. Enjin storan myisam hanya menyokong kunci meja, manakala InnoDB bukan sahaja menyokong kunci baris, tetapi juga kunci meja pada tahap tertentu. Mengikut tingkah laku, ia boleh dibahagikan kepada kunci kongsi (baca kunci), kunci eksklusif (kunci tulis) dan kunci niat. Menurut idea mereka, mereka dibahagikan kepada kunci optimistik dan kunci pesimis.

Artikel hari ini menunjukkan cara penguncian optimistik dan penguncian pesimis beroperasi dalam amalan.

Struktur jadual

Pernyataan SQL berikut ialah struktur jadual:

CREATE TABLE `demo`.`user` (
`id` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 0,
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL,
`version` int(1) NULL DEFAULT 1 COMMENT '数据版本号',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;

Sisipkan data simulasi:

BEGIN;
INSERT INTO `user` VALUES (0000000001, '张三', 0, '18228937997@163.com', '18228937997', 1);
INSERT INTO `user` VALUES (0000000002, '李四', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000003, '李四1', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000004, '李四2', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000005, '李四3', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000006, '李四4', 0, '1005349393@163.com', '15683202302', 1);
INSERT INTO `user` VALUES (0000000007, '李四55', 0, '1005349393@163.com', '15683202302', 1);
COMMIT;

Data dalam jadual.

mysql root@127.0.0.1:demo> select * from user;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 张三 | 0 | 18228937997@163.com | 18228937997 | 2 |
| 2 | 李四 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 3 | 李四1 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 4 | 李四2 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 5 | 李四3 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 6 | 李四4 | 0 | 1005349393@163.com | 15683202302 | 1 |
| 7 | 李四55 | 0 | 1005349393@163.com | 15683202302 | 1 |
+----+--------+-----+---------------------+-------------+---------+
7 rows in set
Time: 0.011s

Kunci pesimis

Kunci pesimis ialah kaedah pengendalian kunci yang agak negatif. Rampas kunci terus semasa mengendalikan data. Urus niaga lain yang sedang berjalan akan menunggu sehingga transaksi yang memegang kunci melepaskan kunci.

Kaedah pemprosesan ini boleh memastikan ketekalan data maksimum, tetapi ia boleh membawa kepada masalah seperti tamat masa kunci dan konkurensi rendah. Pertama, kami memulakan transaksi satu dan mengemas kini data dengan id=1 Pada masa ini, kami tidak menyerahkan transaksi.

mysql root@127.0.0.1:demo> begin;
Query OK, 0 rows affected
Time: 0.002s
mysql root@127.0.0.1:demo> update `user` set name = '张三111111'where id = 1;
Query OK, 1 row affected
Time: 0.004s

Kemudian kami memulakan transaksi dua dan mengemas kini data dengan id=1 untuk melihat apa yang akan berlaku pada masa ini?

mysql root@127.0.0.1:demo> begin;
Query OK, 0 rows affected
Time: 0.002s
mysql root@127.0.0.1:demo> update `user` set sex = 1 where id = 1;

Selepas kami melaksanakan kenyataan kemas kini, kami berada dalam keadaan menunggu, dan pernyataan SQL tidak akan dilaksanakan serta-merta Ini kerana apabila transaksi tidak dilakukan, penulisan sepadan dengan data dengan id=1 tidak dikeluarkan.

Kesannya adalah seperti berikut:

Pelaksanaan khusus penguncian optimistik dan penguncian pesimis dalam MySQL

Melalui contoh di atas, kita boleh lebih intuitif Rasai proses pelaksanaan penguncian pesimis.

Kunci optimistik

Kunci optimis percaya bahawa data tidak akan menyebabkan konflik dalam keadaan biasa Konflik data hanya akan diproses apabila data diubah suai. Bagaimanakah konflik ditemui di sini? Kaedah konvensional ialah menambah medan seperti nombor versi atau cap masa pada baris data. (Artikel ini menggunakan versi sebagai cara yang baik untuk membuat versi dan menggunakan cap masa atas sebab yang sama)

Prinsip pelaksanaan penguncian optimistik:

  • Apabila transaksi membaca data , baca medan nombor versi yang sepadan, dengan mengandaikan bahawa nombor versi pada masa ini ialah 1.
  • Transaksi lain juga melakukan operasi baca yang sama. Apabila transaksi dilakukan, 1 dilaksanakan untuk nombor versi Pada masa ini, nombor versi baris data ialah 2.
  • Apabila transaksi kedua melakukan operasi pengubahsuaian, syarat dibuat berdasarkan data perniagaan dan nombor versi ditambah secara lalai sebagai syarat di mana. Pada masa ini, medan nombor versi dalam penyata pengubahsuaian tidak memenuhi syarat di mana, dan transaksi gagal dilaksanakan. Dengan cara ini, fungsi kunci dicapai.

Pelaksanaan khusus penguncian optimistik dan penguncian pesimis dalam MySQL

Klien 1:

mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+------------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+------------+-----+---------------------+-------------+---------+
| 1 | 张三111111 | 0 | 18228937997@163.com | 18228937997 | 1 |
+----+------------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.012s
mysql root@127.0.0.1:demo> update `user` set name = '事务一', version = version + 1 where id = 1 and version = 1;
Query OK, 1 row affected
Time: 0.008s
mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 事务一 | 1 | 18228937997@163.com | 18228937997 | 2 |
+----+--------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.009s

Turutan pelaksanaan penyata kemas kini hendaklah dalam Selepas pelanggan dua melaksanakan pilih, ia melaksanakan.

Klien 2:

mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+------------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+------------+-----+---------------------+-------------+---------+
| 1 | 张三111111 | 1 | 18228937997@163.com | 18228937997 | 1 |
+----+------------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.015s
mysql root@127.0.0.1:demo> update `user` set name = '事务二', version = version + 1 where id = 1 and version = 1;
Query OK, 0 rows affected
Time: 0.003s
mysql root@127.0.0.1:demo> select * from user where id = 1;
+----+--------+-----+---------------------+-------------+---------+
| id | name | sex | email | mobile | version |
+----+--------+-----+---------------------+-------------+---------+
| 1 | 事务一 | 1 | 18228937997@163.com | 18228937997 | 2 |
+----+--------+-----+---------------------+-------------+---------+
1 row in set
Time: 0.012s

Pada masa ini, mengikut struktur yang dikembalikan melalui kemas kini, dapat dilihat bahawa bilangan baris yang terjejas adalah 0, dan pada masa yang sama, pilih pertanyaan Selepas itu, data pulangan tunai juga merupakan data transaksi satu.

Senario terpakai

Kunci pesimis: lebih sesuai untuk senario di mana operasi tulis adalah lebih kerap Jika terdapat sejumlah besar operasi baca, ia akan ditambah setiap masa ia dibaca Kunci, ini akan meningkatkan banyak overhed kunci dan mengurangkan daya pengeluaran sistem.

Penguncian optimistik: lebih sesuai untuk senario dengan operasi pembacaan yang kerap Jika terdapat bilangan operasi penulisan yang banyak, kemungkinan konflik data akan meningkat untuk memastikan ketekalan data , lapisan aplikasi perlu sentiasa mendapatkan semula data, yang akan meningkatkan sejumlah besar operasi pertanyaan dan mengurangkan daya pemprosesan sistem.

Ringkasan

Kedua-duanya mempunyai kelebihan dan kekurangan masing-masing. Kunci optimis digunakan untuk bacaan yang kerap, dan kunci pesimis digunakan untuk penulisan yang kerap.

Penguncian optimistik sesuai untuk situasi di mana terdapat sedikit penulisan, iaitu apabila konflik jarang berlaku Ini boleh menjimatkan kos penguncian dan meningkatkan daya pengeluaran keseluruhan sistem. Tetapi jika konflik sering berlaku, aplikasi lapisan atas akan terus mencuba, yang sebenarnya mengurangkan prestasi Oleh itu, dalam kes ini, adalah lebih sesuai untuk menggunakan penguncian pesimistik mengemas kini sekeping data yang sama adalah tinggi, iaitu, apabila konflik serius, penguncian pesimis digunakan.

Kunci pesimis lebih sesuai untuk senario konsistensi yang kuat, tetapi kecekapannya agak rendah, terutamanya bacaan serentak adalah rendah. Penguncian optimis sesuai untuk senario dengan lebih banyak bacaan dan kurang penulisan dan kurang konflik serentak.

Pembelajaran yang disyorkan: tutorial video mysql

Atas ialah kandungan terperinci Pelaksanaan khusus penguncian optimistik dan penguncian pesimis dalam MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:jb51.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam