Rumah > Artikel > pangkalan data > Apakah prinsip inventori potongan kunci optimistik dalam MySQL?
Menolak inventori dalam sistem e-dagang adalah operasi yang sangat kritikal Contohnya, dalam sistem jualan kilat, jualan berlebihan mestilah dihalang. , jika peniaga menyediakan 100 keping inventori tetapi akhirnya menjual 1,000 keping, ini akan menyebabkan kerugian kewangan. Pernyataan berikut biasanya digunakan semasa menolak inventori:
udpate goods set stock = stock - #{acquire} where sku_id = #{skuId} and stock - #{acquire} >= 0
Mari kita analisa bagaimana penyata ini boleh menghalang inventori terlebih jual secara berkesan untuk melindungi sumber inventori. Dalam demonstrasi artikel ini, kami menggunakan enjin MySQL Innodb dan menetapkan tahap pengasingan kepada bacaan berulang.
Kunci kongsi (Kunci kongsi) juga dipanggil kunci baca Pernyataan untuk melaksanakan kunci kongsi adalah seperti berikut:
select lock in share mode
Kunci eksklusif. (eksklusif) Kunci) juga dipanggil kunci tulis Pernyataan kunci eksklusif adalah seperti berikut:
select for update update delete insert
Hubungan keserasian antara kunci kongsi dan kunci eksklusif adalah seperti berikut:
kami Analisis hubungan keserasian di atas melalui contoh Mula-mula, buat jadual ujian dan tulis data ujian:
CREATE TABLE `test_account` ( `id` bigint(20) NOT NULL, `name` varchar(20) DEFAULT NULL, `account` bigint(20) DEFAULT NULL, `version` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `test_account`(`id`,`name`,`account`,`version`) values (1,'A',100,1); insert into `test_account`(`id`,`name`,`account`,`version`) values (2,'B',200,1); insert into `test_account`(`id`,`name`,`account`,`version`) values (3,'C',300,1);
(1) Baca dan baca keserasian
kunci kongsi dan kunci kongsi Dalam contoh berikut, sesi1 boleh memperoleh hasil yang dijangkakan dengan melaksanakan pertanyaan pada masa t3 dan sesi2 pada masa t4:(2 ) Baca dan tulis pengecualian bersama
Kunci kongsi dan kunci eksklusif adalah saling eksklusif Dalam contoh berikut, sesi1 menambah kunci kongsi pada masa t3, dan hasilnya boleh dibaca dengan betul, tetapi sesi2 cuba untuk. tambah kunci eksklusif pada masa t4, tetapi ini Apabila kunci diduduki oleh sesi1, sesi2 perlu menunggu Apabila sesi1 tidak melepaskan kunci untuk masa yang lama, sesi2 membuang pengecualian tamat masa kunci: (3) Interaksi tulis-tulis PengecualianPengecualian bersama antara kunci eksklusif dan kunci eksklusif Dalam contoh berikut, sesi1 menambah kunci eksklusif pada masa t3, dan hasilnya boleh dibaca dengan betul, tetapi sesi2 cuba menambah kunci eksklusif pada masa t4, tetapi pada masa ini kunci diduduki oleh sesi1, dan sesi2 perlu menunggu apabila sesi1 tidak melepaskan kunci untuk masa yang lama , session2 membuang pengecualian tamat masa kunci:
1.2 Bacaan Semasa dan Bacaan Syot Kilat
Bacaan syot kilat tidak memerlukan penguncian Apa yang dibaca ialah versi rekod yang boleh dilihat, yang mungkin versi sejarah. Sama seperti petikan pesanan, walaupun harga produk berubah selepas pengguna membuat pesanan, petikan pesanan kekal tidak berubah. Kenyataan baca semasa dilaksanakan seperti berikut:
select
Untuk membaca versi terkini rekod tanpa diubah suai oleh transaksi lain, rekod semasa perlu dikunci. Pernyataan baca semasa dilaksanakan seperti berikut:
select lock in share mode select for update update delete insert
Kami menganalisis petikan bacaan dan bacaan semasa melalui contoh Session2 mengubah suai rekod pada t4 dan menyerahkannya pada t5, dan membacanya ini Hasilnya ialah 100 apabila urus niaga bermula Bacaan semasa dilakukan pada t7, dan versi terkini keputusan 101 telah dibaca:
Apakah proses bacaan semasa. suka? Kami mengambil kemas kini sebagai contoh untuk menganalisis proses bacaan semasa:
Kali pertama kejadian program mengeluarkan permintaan baca semasa, enjin storan mengembalikan rekod pertama yang memenuhi di mana keadaan dan menguncinya , contoh program kemudian mengeluarkan permintaan kemas kini, dan storan menyebabkan operasi menyelesaikan respons dengan jayanya. Laksanakan mengikut urutan sehingga semua rekod yang memenuhi syarat di mana dilaksanakan.
Di sini kami membuat beberapa sambungan Tahap RR menyediakan dua mekanisme untuk mengelakkan masalah bacaan hantu: Kaedah pertama ialah bacaan syot kilat, yang membaca syot kilat apabila transaksi semasa dimulakan. Satu kaedah untuk bacaan semasa ialah menggunakan mekanisme Next-Key Lock untuk menghalang bacaan hantu.
2 Prinsip Pengunci Optimis
update test_account set account = account - 100, version = version + 1 where id = 1 and version = 1
Pernyataan di atas menggunakan penguncian optimistik Kami tahu penguncian optimistik melindungi sumber, jadi jawapannya ia tidak akan ditolak dua kali, tetapi kami tidak boleh berhenti di situ dalam Bab 1. :
Pada masa t2, session1 dan session2 melaksanakan operasi kemas kini pada masa yang sama Memandangkan kemas kini akan menambah kunci eksklusif, hanya satu daripadanya boleh berjaya: session1 berjaya, dan session2 menyekat dan menunggu giliran.
Pada masa t3, session1 melakukan transaksi untuk melepaskan kunci eksklusif Pada masa ini, session2 memperoleh kunci untuk bacaan semasa, tetapi pada masa ini nilai versi rekod dengan id=1 telah menjadi 2, dan dilaksanakan. kenyataan tidak boleh menanyakan data untuk dikemas kini, jadi tidak ada Rekod dikemas kini.
Sekiranya anda memahami prinsip penguncian optimistik dalam Bab 2, maka prinsip pengurangan inventori sudah jelas. Jika dua benang Adakah terlebih jual akan berlaku jika inventori dikurangkan pada masa yang sama?
Pada masa t2, session1 dan session2 laksanakan kemas kini untuk mengurangkan inventori pada masa yang sama Memandangkan kemas kini akan menambah kunci eksklusif, hanya satu daripada dua yang boleh berjaya: session1 berjaya , dan session2 menyekat dan menunggu.
Pada masa t3, session1 melakukan transaksi dan melepaskan kunci eksklusif Pada masa ini, session2 memperoleh kunci untuk bacaan semasa, tetapi pada masa ini, inventori produk 1 telah menjadi 0, yang tidak lagi. berpuas hati (di mana stok - 1 >= 0) Syarat: Penyata pelaksanaan tidak boleh menanyakan data untuk dikemas kini, jadi tiada rekod dikemas kini.
Atas ialah kandungan terperinci Apakah prinsip inventori potongan kunci optimistik dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!