网站开发有哪几种语言,仁寿网站建设,茂名建网站,五个网络营销方式MySQL-锁#xff1a;共享锁#xff08;读#xff09;、排他锁#xff08;写#xff09;、表锁、行锁、意向锁、间隙锁 共享锁#xff08;读锁#xff09;、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制#xff0c;它们确保数据的一致性… MySQL-锁共享锁读、排他锁写、表锁、行锁、意向锁、间隙锁 共享锁读锁、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制它们确保数据的一致性和完整性。下面是MySQL数据库中常见的锁类型以及它们的特点和应用场景
共享锁Shared Lock 特点共享锁允许多个事务同时读取同一资源但阻止其他事务获取排他锁从而防止并发写入。应用场景适用于读取操作例如SELECT语句。 排他锁Exclusive Lock 特点排他锁阻塞其他事务的读锁和写锁只允许一个事务对资源进行写操作防止其他事务读取或写入资源。应用场景适用于写入或修改操作例如INSERT、UPDATE、DELETE语句。 表锁Table Lock 特点表锁会锁定整张表阻塞其他事务对表的写操作但不阻塞对表的读操作。应用场景适用于对整张表进行操作的场景例如MyISAM存储引擎的表级锁。 行锁Row Lock 特点行锁允许事务锁定表中的特定行而不是整张表提高并发性。但容易引发死锁。应用场景适用于需要精确控制行级别访问的场景例如InnoDB存储引擎的行级锁。 意向锁Intention Locks 意向锁是一种表明事务将在某个级别上加锁的锁类型。意向锁有两种类型意向共享锁和意向排他锁。它们用于表示一个事务打算在一个更高的层级上如行级别或表级别加锁。意向锁是为了帮助数据库管理系统了解一个事务打算在哪个级别上进行锁定以便避免死锁。 间隙锁Gap Locks 间隙锁是一种特殊类型的锁用于防止其他事务将新的键插入到已有的索引范围中。间隙锁在某个范围的键之间创建了一个间隙防止其他事务插入新的键。间隙锁通常与范围查询操作一起使用例如SELECT ... WHERE ... BETWEEN ... AND ...语句。
现在让我们来看一个实际案例说明MySQL中锁的应用 假设有一个电子商务网站多个用户同时访问产品库存信息并尝试下单购买同一件商品这时候可能会涉及到对产品库存的读写操作。 对于读取产品库存信息的操作可以使用共享锁读锁允许多个用户同时读取产品库存信息不会互相阻塞保证并发性。当某个用户下单购买商品时需要更新产品库存信息此时需要使用排他锁写锁阻止其他用户同时修改库存信息确保数据的一致性。
如果没有使用合适的锁机制可能会导致以下问题
如果多个用户同时读取产品库存信息但不加锁则可能读取到错误的库存数量。如果多个用户同时尝试购买同一件商品而没有加锁则可能导致超卖或者库存错误的问题。
共享锁读锁、排他锁
CREATE TABLE articles (article_id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),content TEXT
);事务1查看博客文章内容共享锁
共享锁允许多个事务同时读取同一资源但阻止其他事务获取排他锁从而防止并发写入。
START TRANSACTION;
SELECT * FROM articles WHERE article_id 123 LOCK IN SHARE MODE;
-- 读取文章内容
COMMIT;事务2可以编辑文章内容排他锁
排他锁阻塞其他事务的读锁和写锁只允许一个事务对资源进行写操作防止其他事务读取或写入资源
START TRANSACTION;
SELECT * FROM articles WHERE article_id 123 FOR UPDATE;
-- 编辑文章内容
UPDATE articles SET content New content WHERE article_id 123;
COMMIT;表锁
假设有一个在线预订系统有一个订单表需要定期对订单表进行清理和维护操作
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,order_date DATETIME
);-- 事务1清理过期订单表锁
START TRANSACTION;
LOCK TABLES orders WRITE;
-- 清理过期订单
DELETE FROM orders WHERE order_date DATE_SUB(NOW(), INTERVAL 30 DAY);
UNLOCK TABLES;
COMMIT;行锁
假设有一个在线论坛系统用户可以对帖子进行评论需要确保在用户对同一篇帖子进行评论时不会产生冲突。
CREATE TABLE posts (post_id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),content TEXT
);CREATE TABLE comments (comment_id INT AUTO_INCREMENT PRIMARY KEY,post_id INT,user_id INT,comment_text TEXT,
);-- 事务1添加评论行锁
START TRANSACTION;
SELECT * FROM posts WHERE post_id 123 FOR UPDATE;
-- 添加评论
INSERT INTO comments (post_id, user_id, comment_text) VALUES (123, 456, Great post!);
COMMIT;
事务执行SELECT * FROM posts WHERE post_id 123 FOR UPDATE;语句获取了帖子ID为123的行级排他锁。这样做的目的是确保在添加评论之前对于帖子ID为123的行数据其他事务无法同时修改以避免数据不一致或丢失的情况发生
意向锁
假设有一个在线购物系统其中有两张表orders订单表和order_details订单详情表。订单表记录了每个订单的基本信息订单详情表则记录了每个订单中的具体商品信息。
CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,order_date DATETIME
);CREATE TABLE order_details (id INT AUTO_INCREMENT PRIMARY KEY,order_id INT,product_id INT,quantity INT,
);现在假设有一个事务需要向订单表中插入一条新的订单记录并且需要向订单详情表中插入相关的商品信息。
START TRANSACTION;-- 获取意向排他锁表明将在订单表上进行排他锁定
SELECT * FROM orders WHERE customer_id 100 FOR UPDATE;-- 插入新的订单记录
INSERT INTO orders (customer_id, order_date) VALUES (100, NOW());
SET last_order_id LAST_INSERT_ID();-- 插入订单详情
INSERT INTO order_details (order_id, product_id, quantity) VALUES (last_order_id, 1, 2);
INSERT INTO order_details (order_id, product_id, quantity) VALUES (last_order_id, 2, 3);COMMIT;初始 执行事务后 在这个例子中事务首先获取了意向排他锁以表明将在订单表上进行排他锁定。然后向订单表中插入了一条新的订单记录并且通过获取LAST_INSERT_ID()函数获取了刚插入的订单ID接着向订单详情表中插入了相关的商品信息。
间隙锁
假设有一个产品表其中的产品ID是一个唯一索引。现在有两个事务一个事务需要检查某个特定的产品是否存在而另一个事务需要向产品表中插入一个新的产品。
-- 事务1检查产品是否存在
START TRANSACTION;
SELECT * FROM products WHERE product_id 5 LOCK IN SHARE MODE;
-- 如果存在特定产品则执行相应操作
COMMIT;-- 事务2插入新的产品
START TRANSACTION;
-- 获取间隙锁防止其他事务在该范围内插入新的产品
SELECT * FROM products WHERE product_id 4 AND product_id 6 FOR UPDATE;
-- 插入新的产品
INSERT INTO products (product_id, name, price) VALUES (5, New Product, 10.99);
COMMIT;事务1检查产品是否存在 START TRANSACTION;
SELECT * FROM products WHERE product_id 5 LOCK IN SHARE MODE;
-- 如果存在特定产品则执行相应操作
INSERT INTO products (product_id, name, price) VALUES (5, New Product, 23.11);
COMMIT;无法插入 在这个事务中我们使用LOCK IN SHARE MODE语句获取了产品ID为5的共享锁以确保其他事务可以同时读取相同的产品信息但是不能进行写操作。
事务2插入新的产品 START TRANSACTION;
-- 获取间隙锁防止其他事务在该范围内插入新的产品
SELECT * FROM products WHERE product_id 4 AND product_id 6 FOR UPDATE;
-- 插入新的产品
INSERT INTO products (product_id, name, price) VALUES (5, New Product, 10.99);
COMMIT;无法插入 在这个事务中我们使用FOR UPDATE语句获取了产品ID大于4且小于6的间隙锁以防止其他事务在这个范围内插入新的产品。然后我们向产品表中插入了一个新的产品。
锁升级
在MySQL中锁升级是指事务在执行过程中将当前持有的锁从低级别升级到更高级别的过程。这个过程通常是为了保证数据的完整性和一致性同时尽量减少锁的持有时间以提高并发性能。
MySQL中的锁升级有时是隐式的有时需要显式操作。以下是一些锁升级的例子以及相应的SQL语句
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),category_id INT,price DECIMAL(10, 2),quantity INT
);CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,customer_id INT,product_id INT,quantity INT,order_date DATETIME,
);从行级锁升级到表级锁 例子 START TRANSACTION;
SELECT * FROM products WHERE category_id 1 FOR UPDATE;
-- 此时事务持有了行级锁-- 执行一些操作需要将行级锁升级到表级锁
UPDATE products SET price price * 0.9 WHERE category_id 1;COMMIT;在这个例子中事务开始时使用SELECT ... FOR UPDATE语句获取了category_id为1的产品行的排他锁随后执行更新操作需要将行级锁升级为表级锁。 从共享锁升级到排他锁 例子 START TRANSACTION;
SELECT * FROM products WHERE category_id 1 LOCK IN SHARE MODE;
-- 此时事务持有了共享锁-- 执行一些操作需要将共享锁升级到排他锁
UPDATE products SET quantity quantity - 1 WHERE category_id 1;COMMIT;在这个例子中事务开始时使用LOCK IN SHARE MODE语句获取了category_id为1的产品行的共享锁但在后续执行中需要对该行进行修改因此需要将共享锁升级为排他锁。 从意向锁升级到表级锁 例子 START TRANSACTION;
SELECT * FROM orders WHERE customer_id 100 FOR UPDATE;
-- 此时事务持有了意向排他锁-- 执行一些操作需要将意向锁升级为表级锁
DELETE FROM orders WHERE customer_id 100;COMMIT;在这个例子中事务开始时使用SELECT ... FOR UPDATE语句获取了customer_id为100的订单行的意向排他锁后续执行了删除操作需要将意向锁升级为表级锁。 文章转载自: http://www.morning.nqmwk.cn.gov.cn.nqmwk.cn http://www.morning.djpps.cn.gov.cn.djpps.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.tndhm.cn.gov.cn.tndhm.cn http://www.morning.mmhaoma.com.gov.cn.mmhaoma.com http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.ysjjr.cn.gov.cn.ysjjr.cn http://www.morning.jjzrh.cn.gov.cn.jjzrh.cn http://www.morning.rfpq.cn.gov.cn.rfpq.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.kjfqf.cn.gov.cn.kjfqf.cn http://www.morning.qmbgb.cn.gov.cn.qmbgb.cn http://www.morning.mlnzx.cn.gov.cn.mlnzx.cn http://www.morning.kcbml.cn.gov.cn.kcbml.cn http://www.morning.ksggl.cn.gov.cn.ksggl.cn http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn http://www.morning.jmlgk.cn.gov.cn.jmlgk.cn http://www.morning.kflzy.cn.gov.cn.kflzy.cn http://www.morning.kmqjx.cn.gov.cn.kmqjx.cn http://www.morning.yrsg.cn.gov.cn.yrsg.cn http://www.morning.xblrq.cn.gov.cn.xblrq.cn http://www.morning.cwskn.cn.gov.cn.cwskn.cn http://www.morning.nwgkk.cn.gov.cn.nwgkk.cn http://www.morning.grbp.cn.gov.cn.grbp.cn http://www.morning.wmhqd.cn.gov.cn.wmhqd.cn http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn http://www.morning.rxcqt.cn.gov.cn.rxcqt.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.nfcxq.cn.gov.cn.nfcxq.cn http://www.morning.bqmdl.cn.gov.cn.bqmdl.cn http://www.morning.jbtwq.cn.gov.cn.jbtwq.cn http://www.morning.ltywr.cn.gov.cn.ltywr.cn http://www.morning.ftlgy.cn.gov.cn.ftlgy.cn http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn http://www.morning.djlxz.cn.gov.cn.djlxz.cn http://www.morning.fqklt.cn.gov.cn.fqklt.cn http://www.morning.gdgylp.com.gov.cn.gdgylp.com http://www.morning.gxcit.com.gov.cn.gxcit.com http://www.morning.lxyyp.cn.gov.cn.lxyyp.cn http://www.morning.rfpq.cn.gov.cn.rfpq.cn http://www.morning.kstgt.cn.gov.cn.kstgt.cn http://www.morning.lqzhj.cn.gov.cn.lqzhj.cn http://www.morning.51meihou.cn.gov.cn.51meihou.cn http://www.morning.fqyxb.cn.gov.cn.fqyxb.cn http://www.morning.sypzg.cn.gov.cn.sypzg.cn http://www.morning.mqzcn.cn.gov.cn.mqzcn.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.xkhhy.cn.gov.cn.xkhhy.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.hhfqk.cn.gov.cn.hhfqk.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.zhengdaotang.cn.gov.cn.zhengdaotang.cn http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn http://www.morning.ntdzjx.com.gov.cn.ntdzjx.com http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn http://www.morning.cndxl.cn.gov.cn.cndxl.cn http://www.morning.rdbj.cn.gov.cn.rdbj.cn http://www.morning.mnbcj.cn.gov.cn.mnbcj.cn http://www.morning.rdsst.cn.gov.cn.rdsst.cn http://www.morning.lsqmb.cn.gov.cn.lsqmb.cn http://www.morning.ypwlb.cn.gov.cn.ypwlb.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.mtrfz.cn.gov.cn.mtrfz.cn http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn http://www.morning.qzpkr.cn.gov.cn.qzpkr.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.yxgqr.cn.gov.cn.yxgqr.cn http://www.morning.fthcq.cn.gov.cn.fthcq.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.sjftk.cn.gov.cn.sjftk.cn http://www.morning.gtbjc.cn.gov.cn.gtbjc.cn http://www.morning.ybhjs.cn.gov.cn.ybhjs.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.rlpmy.cn.gov.cn.rlpmy.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.wyzby.cn.gov.cn.wyzby.cn