Perbezaan: Kunci pesimis ialah sikap pesimis terhadap pemprosesan data Ia sentiasa percaya bahawa konflik konkurensi akan berlaku apabila memperoleh dan mengubah suai data, oleh itu, data perlu dikunci semasa keseluruhannya proses pemprosesan data. Penguncian optimistik adalah optimistik tentang pemprosesan data dan percaya bahawa konflik biasanya tidak akan berlaku Hanya apabila kemas kini data diserahkan, konflik data akan dikesan.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Penguncian pesimis dan penguncian optimistik ialah konsep yang ditakrifkan oleh orang ramai Anda boleh memahaminya sebagai idea dan kaedah biasa untuk menangani sumber serentak.
Jangan kelirukan mereka dengan mekanisme kunci (kunci meja, kunci baris, kunci eksklusif, kunci kongsi) yang disediakan dalam mysql.
1. Kunci pesimis
Seperti namanya, sikap pesimis terhadap pemprosesan data akan berlaku apabila data diperolehi diubah suai, yang lain akan mengubah suai data. Oleh itu, data perlu dikunci semasa keseluruhan proses pemprosesan data.
Pelaksanaan kunci pesimis biasanya bergantung pada mekanisme kunci yang disediakan oleh pangkalan data, seperti kunci eksklusif mysql dan pilih .... untuk kemas kini bagi melaksanakan kunci pesimis.
Contoh: Semasa jualan kilat produk, kuantiti inventori dikurangkan untuk mengelakkan situasi terlebih jual.
CREATE TABLE `tb_goods_stock` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '商品ID', `nums` int(11) unsigned DEFAULT '0' COMMENT '商品库存数量', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `modify_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`), UNIQUE KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品库存表';
Tetapkan jenis medan nombor kuantiti inventori produk kepada tidak ditandatangani untuk memastikan nombor negatif tidak akan berlaku pada peringkat pangkalan data.
Perhatikan bahawa untuk menggunakan penguncian pesimis, anda perlu mematikan fungsi autokomit mysql dan menetapkan autokomit = 0;
Perhatikan bahawa kunci peringkat baris dalam mysql adalah berdasarkan indeks Jika sql tidak menggunakan indexes , yang akan mengunci seluruh jadual menggunakan kunci peringkat jadual.
1. Buka transaksi, tanya produk yang hendak dijual dan kunci rekod.
begin;select nums from tb_goods_stock where goods_id = {$goods_id} for update;
2. Tentukan sama ada kuantiti produk lebih besar daripada kuantiti pembelian. Jika tidak berpuas hati, gulung semula transaksi.
3. Jika syarat dipenuhi, kurangkan inventori dan serahkan transaksi.
update tb_goods_stock set nums = nums - {$num} where goods_id = {$goods_id} and nums >= {$num}; commit;
Apabila transaksi dilakukan, kunci semasa transaksi akan dilepaskan.
Kunci pesimis mengamalkan strategi konservatif mengunci dahulu dan kemudian memproses data dalam kawalan serentak Walaupun ia memastikan keselamatan pemprosesan data, ia juga mengurangkan kecekapan.
2. Penguncian yang optimistik
Seperti namanya, ia adalah optimistik tentang pemprosesan data Secara optimistik, adalah dipercayai bahawa data secara amnya tidak akan bercanggah dan hanya menyerahkan Konflik data hanya akan dikesan apabila data dikemas kini.
Jika konflik ditemui, mesej ralat akan dikembalikan kepada pengguna, membolehkan pengguna memutuskan cara untuk beroperasi.
Pelaksanaan penguncian optimistik tidak bergantung pada mekanisme penguncian yang disediakan oleh pangkalan data Kami perlu melaksanakannya sendiri Kaedah pelaksanaan secara amnya adalah untuk merekodkan versi data, satu melalui nombor versi, dan lain adalah melalui cap masa.
Tambahkan nombor versi atau medan cap masa pada jadual, baca nombor versi bersama-sama Apabila data dikemas kini, tambahkan 1 pada nombor versi.
Apabila kami menyerahkan kemas kini data, kami menentukan sama ada nombor versi semasa adalah sama dengan nombor versi baca pertama. Jika ia adalah sama, kemas kini mereka jika tidak, data akan dianggap tamat tempoh, kemas kini akan ditolak, dan pengguna akan diminta untuk beroperasi semula.
CREATE TABLE `tb_goods_stock` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `goods_id` bigint(20) unsigned DEFAULT '0' COMMENT '商品ID', `nums` int(11) unsigned DEFAULT '0' COMMENT '商品库存数量', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `modify_time` datetime DEFAULT NULL COMMENT '更新时间', `version` bigint(20) unsigned DEFAULT '0' COMMENT '版本号', PRIMARY KEY (`id`), UNIQUE KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='商品库存表';
1. Tanya produk yang ingin anda jual dan dapatkan nombor versi.
begin;select nums, version from tb_goods_stock where goods_id = {$goods_id};
2. Tentukan sama ada kuantiti produk lebih besar daripada kuantiti pembelian. Jika tidak berpuas hati, gulung semula transaksi.
3. Jika syarat dipenuhi, kurangkan inventori. (Apabila mengemas kini, tentukan sama ada versi semasa adalah sama dengan versi yang diperoleh dalam langkah 1)
update tb_goods_stock set nums = nums - {$num}, version = version + 1 where goods_id = {$goods_id} and version = {$version} and nums >= {$num};
4. Tentukan sama ada operasi kemas kini berjaya dilaksanakan Jika berjaya, serahkannya, jika tidak, gulung semula.
Penguncian optimistik adalah berdasarkan pelaksanaan program, jadi tiada jalan buntu dan sesuai untuk senario aplikasi dengan banyak bacaan. Jika konflik sering berlaku, aplikasi lapisan atas akan sentiasa meminta pengguna untuk beroperasi semula, yang sebenarnya akan mengurangkan prestasi Dalam kes ini, penguncian pesimis adalah lebih sesuai.
(Tutorial disyorkan: tutorial video mysql)
Atas ialah kandungan terperinci Apakah perbezaan antara penguncian optimistik dan penguncian pesimis dalam mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!