Untuk memastikan ketepatan data dalam persekitaran berbilang benang, biasanya perlu menggunakan mekanisme penyegerakan. Penyegerakan adalah bersamaan dengan mengunci. Tujuan kunci ialah apabila satu utas mengendalikan data, utas lain perlu menunggu, yang boleh membawa faedah berikut. 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.
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.
Pengkelasan mengikut operasi:
Kunci dikongsi: juga dipanggil kunci baca. Berbilang urus niaga boleh membaca data yang sama pada masa yang sama dan mengunci pada masa yang sama untuk mengelak daripada menjejaskan satu sama lain, tetapi mereka tidak boleh mengubah suai rekod data.
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 mengunci adalah cepat; kebuntuan tidak akan berlaku; Lebih suka enjin storan MyISAM!
Kunci peringkat baris: Semasa operasi, baris operasi semasa akan dikunci. Dalam kes konkurensi yang tinggi, butiran penguncian adalah kecil, yang bermanfaat untuk mengurangkan kebarangkalian konflik kunci, tetapi perhatian mesti dibayar kepada kelajuan operasi penguncian untuk mengelakkan overhed yang berlebihan, dan kejadian kebuntuan mesti dielakkan. 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 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 terus, tetapi jika yang satu lagi ingin bertanya, ia mesti menunggu penyerahan pengubahsuaian berikutnya. Kunci hilang selepas penyerahan Kunci kongsi:SELECT语句 LOCK IN SHARE MODE;
- 窗口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;
-- 窗口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;
-- 标准语法 SELECT语句 FOR UPDATE;
-- 窗口1 /* 排他锁:加锁的数据,不能被其他事务加锁查询或修改 */ -- 开启事务 START TRANSACTION; -- 查询id为1的数据记录,并加入排他锁 SELECT * FROM student WHERE id=1 FOR UPDATE; -- 提交事务 COMMIT;
-- 窗口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;
-- 加锁 LOCK TABLE 表名 READ; -- 解锁(将当前会话所有的表进行解锁) UNLOCK TABLES;
-- 标准语法 -- 加锁 LOCK TABLE 表名 WRITE; -- 解锁(将当前会话所有的表进行解锁) UNLOCK TABLES;
kunci pesimis :
sangat pesimis dengan sikap konservatif 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:
sangat optimistik Setiap kali anda mengendalikan data, anda fikir tiada siapa yang akan mengubah suainya, jadi anda tidak menguncinya. Tetapi apabila mengemas kini, ia akan dinilai sama ada data telah diubah suai dalam tempoh ini. Pengguna perlu melaksanakannya sendiri Preemption sumber serentak tidak akan berlaku Hanya apabila menyerahkan operasi, integriti data diperiksa untuk pelanggaran. Pelaksanaan mudah penguncian optimistik: Idea pelaksanaan: tambah penanda untuk dibandingkan, jika ia sama, ia akan dilaksanakan, jika ia berbeza, ia tidak akan dilaksanakan方式一:版本号
给数据表中添加一个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
每次更新后都将最新时间插入到此列。
读取数据时,将时间读取出来,在执行更新的时候,比较时间。
如果相同则执行更新,如果不相同,说明此条数据已经发生了变化。
悲观锁和乐观锁使用前提:
当读取操作远多于写操作时,更新操作被加锁会阻塞所有读取操作,降低了系统的吞吐量。最后还要释放锁,锁是需要一些开销的,这时候可以选择乐观锁。
如果是读写比例差距不是非常大或者系统没有响应不及时,吞吐量瓶颈的问题,那就不要去使用乐观锁,它增加了复杂度,也带来了业务额外的风险。这时候可以选择悲观锁。
Atas ialah kandungan terperinci Apakah konsep mekanisme kunci mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!