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.
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.
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 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:
Melalui contoh di atas, kita boleh lebih intuitif Rasai proses pelaksanaan penguncian pesimis.
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 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.
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.
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.
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!