Rumah >pangkalan data >tutorial mysql >Analisis terperinci mekanisme kunci mysql

Analisis terperinci mekanisme kunci mysql

WBOY
WBOYke hadapan
2022-03-16 17:33:022186semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang mysql Ia terutamanya memperkenalkan pelbagai isu mekanisme kunci dalam mysql yang digunakan oleh pangkalan data untuk memastikan ketekalan data yang direka untuk membuat sumber yang dikongsi teratur apabila diakses secara serentak, saya harap ia akan membantu semua orang.

Analisis terperinci mekanisme kunci mysql

Pembelajaran yang disyorkan: tutorial mysql

Kunci MySQL:

Jika anda ingin memastikan data dalam berbilang benang Bagaimanakah ketepatan dicapai? Betul, melalui penyegerakan. Penyegerakan adalah bersamaan dengan mengunci. Apakah faedah menambah kunci? Apabila satu utas sebenarnya memanipulasi data, utas lain hanya boleh menunggu. Apabila benang menyelesaikan pelaksanaan, kunci dilepaskan. Hanya benang lain boleh melakukan operasi!

Kemudian fungsi kunci dalam pangkalan data MySQL kami juga serupa Dalam pengasingan pemprosesan transaksi, masalah seperti bacaan kotor, bacaan tidak berulang, dan bacaan hantu mungkin berlaku juga dapat diselesaikan.

Dalam pangkalan data, data adalah sumber yang dikongsi dan diakses oleh ramai pengguna Bagaimana untuk memastikan konsistensi dan keberkesanan akses serentak kepada data adalah masalah yang mesti diselesaikan oleh semua pangkalan data kerana ciri-ciri seni bina MySQL sendiri , Dalam enjin storan yang berbeza, mekanisme penguncian direka untuk menghadapi senario tertentu Oleh itu, perbezaan dalam enjin membawa kepada mekanisme penguncian yang sangat berbeza.

Mekanisme kunci:

Peraturan yang direka oleh pangkalan data untuk memastikan ketekalan data dengan menggunakan pelbagai sumber yang dikongsi menjadi teratur apabila diakses secara serentak.

Contohnya: Apabila membeli produk di tapak web e-dagang, hanya terdapat satu produk dalam senarai produk, dan pada masa ini dua orang membelinya pada masa yang sama, jadi siapa yang boleh membelinya ialah satu isu utama.

Transaksi akan digunakan di sini untuk melaksanakan satu siri operasi:

Mula-mula dapatkan semula data item daripada jadual produk

Kemudian masukkan pesanan

Selepas pembayaran, Kemudian masukkan maklumat jadual pembayaran

Kemas kini kuantiti barang dalam jadual produk

Dalam proses di atas, kunci boleh digunakan untuk melindungi maklumat data kuantiti barangan dan mencapai pengasingan, iaitu, hanya pengguna pertama dibenarkan untuk menyelesaikan keseluruhan proses pembelian, manakala pengguna lain hanya boleh menunggu, sekali gus menyelesaikan masalah konflik secara serentak.

Klasifikasi kunci:

Pengkelasan mengikut operasi:

Kunci dikongsi: juga dipanggil kunci baca. Untuk data yang sama, berbilang operasi baca transaksi boleh dikunci pada masa yang sama tanpa menjejaskan satu sama lain, tetapi rekod data tidak boleh diubah suai.

Kunci eksklusif: juga dipanggil kunci tulis. Sebelum operasi semasa selesai, membaca dan menulis operasi lain akan disekat

Klasifikasi mengikut butiran:

Kunci aras meja: Semasa operasi, seluruh permukaan. Overhed adalah kecil dan penguncian adalah cepat; kebuntuan tidak akan berlaku; Lebih suka enjin storan MyISAM!

Kunci peringkat baris: Semasa operasi, baris operasi semasa akan dikunci. Overhed adalah tinggi dan penguncian adalah perlahan; kebuntuan mungkin berlaku; Lebih suka enjin storan InnoDB!

Kunci peringkat halaman: Butiran kunci, kebarangkalian konflik dan kos penguncian adalah antara kunci meja dan kunci baris Kebuntuan akan berlaku dan prestasi serentak adalah purata.

Dikelaskan mengikut penggunaan:

Kunci pesimis: Setiap kali anda menanyakan data, anda fikir orang lain akan mengubah suainya, jadi anda menguncinya apabila menyoal.

Penguncian optimis: Setiap kali anda menanyakan data, anda fikir orang lain tidak akan mengubah suainya, tetapi apabila mengemas kini, anda akan menilai sama ada orang lain telah mengemas kini data dalam tempoh ini

Enjin storan berbeza menyokong Kunci

Analisis terperinci mekanisme kunci mysql

Kunci kongsi:

Berbilang kunci kongsi boleh dikongsi jika ada kunci, InnoDB lalai kepada satu baris kunci. Jika tidak, ia akan Ditingkatkan kepada kunci meja, apabila kunci baris digunakan, berbilang tetingkap boleh mengubah suai data baris yang berbeza boleh diubah suai secara langsung, tetapi jika yang satu lagi ingin bertanya, ia mesti menunggu penyerahan pengubahsuaian berikutnya. Kunci hilang selepas penyerahan

Kunci kongsi:

SELECT语句 LOCK IN SHARE MODE;
Tetingkap 1:

- 窗口1
/*
    共享锁:数据可以被多个事务查询,但是不能修改
*/
-- 开启事务
START TRANSACTION;
-- 查询id为1的数据记录。加入共享锁
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;
-- 查询分数为99分的数据记录。加入共享锁
SELECT * FROM student WHERE score=99 LOCK IN SHARE MODE;
-- 提交事务
COMMIT;
Tetingkap 2:

-- 窗口2
-- 开启事务
START TRANSACTION;
-- 查询id为1的数据记录(普通查询,可以查询)
SELECT * FROM student WHERE id=1;
-- 查询id为1的数据记录,并加入共享锁(可以查询。共享锁和共享锁兼容)
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;
-- 修改id为1的姓名为张三三(不能修改,会出现锁的情况。只有窗口1提交事务后,才能修改成功)
UPDATE student SET NAME='张三三' WHERE id = 1;
-- 修改id为2的姓名为李四四(修改成功,InnoDB引擎默认是行锁)
UPDATE student SET NAME='李四四' WHERE id = 2;
-- 修改id为3的姓名为王五五(修改失败,InnoDB引擎如果不采用带索引的列加锁。则会提升为表锁)
UPDATE student SET NAME='王五五' WHERE id = 3;
-- 提交事务
COMMIT;
Kunci eksklusif :

Apabila kunci eksklusif dilaksanakan, pertanyaan biasa transaksi lain boleh dilakukan, tetapi tiada operasi mengunci dibenarkan

-- 标准语法
SELECT语句 FOR UPDATE;
Tetingkap 1:

-- 窗口1
/*
    排他锁:加锁的数据,不能被其他事务加锁查询或修改
*/
-- 开启事务
START TRANSACTION;
-- 查询id为1的数据记录,并加入排他锁
SELECT * FROM student WHERE id=1 FOR UPDATE;
-- 提交事务
COMMIT;
Tetingkap 2:

-- 窗口2
-- 开启事务
START TRANSACTION;
-- 查询id为1的数据记录(普通查询没问题)
SELECT * FROM student WHERE id=1;
-- 查询id为1的数据记录,并加入共享锁(不能查询。因为排他锁不能和其他锁共存)
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;
-- 查询id为1的数据记录,并加入排他锁(不能查询。因为排他锁不能和其他锁共存)
SELECT * FROM student WHERE id=1 FOR UPDATE;
-- 修改id为1的姓名为张三(不能修改,会出现锁的情况。只有窗口1提交事务后,才能修改成功)
UPDATE student SET NAME='张三' WHERE id=1;
-- 提交事务
COMMIT;
Kunci MyISAM:

Kunci baca MyISAM:

myisam menambah kunci pada keseluruhan jadual apabila membaca kunci, semua transaksi boleh disemak jika ia tidak dibuka kuncinya. Tiada operasi lain dibenarkan, termasuk transaksi sendiri

-- 加锁
LOCK TABLE 表名 READ;
-- 解锁(将当前会话所有的表进行解锁)
UNLOCK TABLES;
Kunci tulis MyISAM:

Apabila menulis kunci, tiada operasi boleh dilakukan selagi transaksi lain. tidak dikunci. Transaksi sendiri Boleh beroperasi

-- 标准语法
-- 加锁
LOCK TABLE 表名 WRITE;
-- 解锁(将当前会话所有的表进行解锁)
UNLOCK TABLES;

Kunci pesimis:

sangat pesimistik terhadap data yang diubah suai oleh dunia luar dan percaya bahawa data akan diubah suai pada bila-bila masa.

Data perlu dikunci semasa keseluruhan pemprosesan data. Penguncian pesimis secara amnya bergantung pada mekanisme penguncian yang disediakan oleh pangkalan data hubungan.

Kunci baris dan kunci meja ialah kunci pesimis tidak kira sama ada kunci itu dibaca atau ditulis.

Kunci optimis:

就是很乐观,每次自己操作数据的时候认为没有人会来修改它,所以不去加锁。

但是在更新的时候会去判断在此期间数据有没有被修改。

需要用户自己去实现,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。

乐观锁的简单实现方式:

实现思想:加标记去比较,一样则执行,不同则不执行

方式一:版本号

给数据表中添加一个version列,每次更新后都将这个列的值加1。

读取数据时,将版本号读取出来,在执行更新的时候,比较版本号。

如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。

用户自行根据这个通知来决定怎么处理,比如重新开始一遍,或者放弃本次更新。

-- 创建city表
CREATE TABLE city(
    id INT PRIMARY KEY AUTO_INCREMENT,  -- 城市id
    NAME VARCHAR(20),                   -- 城市名称
    VERSION INT                         -- 版本号
);
-- 添加数据
INSERT INTO city VALUES (NULL,'北京',1),(NULL,'上海',1),(NULL,'广州',1),(NULL,'深圳',1);
-- 修改北京为北京市
-- 1.查询北京的version
SELECT VERSION FROM city WHERE NAME='北京';
-- 2.修改北京为北京市,版本号+1。并对比版本号
UPDATE city SET NAME='北京市',VERSION=VERSION+1 WHERE NAME='北京' AND VERSION=1;

方式二:时间戳

和版本号方式基本一样,给数据表中添加一个列,名称无所谓,数据类型需要是timestamp

每次更新后都将最新时间插入到此列。

读取数据时,将时间读取出来,在执行更新的时候,比较时间。

如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。

悲观锁和乐观锁使用前提:

对于读的操作远多于写的操作的时候,这时候一个更新操作加锁会阻塞所有的读取操作,降低了吞吐量。最后还要释放锁,锁是需要一些开销的,这时候可以选择乐观锁。

如果是读写比例差距不是非常大或者系统没有响应不及时,吞吐量瓶颈的问题,那就不要去使用乐观锁,它增加了复杂度,也带来了业务额外的风险。这时候可以选择悲观锁。

推荐学习:mysql学习教程

Atas ialah kandungan terperinci Analisis terperinci mekanisme kunci mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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