Rumah  >  Artikel  >  pangkalan data  >  Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

WBOY
WBOYke hadapan
2023-06-03 09:30:25774semak imbas

    1 Pengetahuan asas

    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.

    1.1 Kunci kongsi dan kunci eksklusif

    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:

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

    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:

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

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

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

    (3) Interaksi tulis-tulis Pengecualian

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

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?1.2 Bacaan Semasa dan Bacaan Syot Kilat

    Enjin storan MySQL Innodb dilaksanakan berdasarkan kawalan konkurensi berbilang versi protokol MVCC Dalam kawalan konkurensi MVCC, operasi baca boleh dibahagikan kepada bacaan syot kilat dan bacaan semasa.

    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 prinsip inventori potongan kunci optimistik dalam MySQL?Apakah proses bacaan semasa. suka? Kami mengambil kemas kini sebagai contoh untuk menganalisis proses bacaan semasa:

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?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

    Kami menyepadukan pengetahuan di atas melalui soalan: Terdapat dua urutan melaksanakan penyata berikut pada masa yang sama Adakah nilai akaun rekod ini dengan id=1 berjaya?

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

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?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.

    3 Prinsip pengurangan inventori

    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?

    Apakah prinsip inventori potongan kunci optimistik dalam MySQL?

    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!

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