MySQL悲观锁经常在大厂被问到,观锁比如MySQL悲观锁是什底什么?MySQL悲观锁有哪些?底层原理...等等,下面我来详解MySQL悲观锁。层实 MySQL悲观锁 图片
在 MySQL 中悲观锁(Pessimistic Lock),现原是观锁一种并发控制机制,用于防止多个事务同时修改同一条数据,什底从而确保数据一致性。层实 基于“悲观”的现原假设,认为在多用户环境下,观锁数据被多个事务同时访问、什底或修改的层实冲突概率较高。 因此,现原在操作数据之前,观锁先对数据加锁,什底确保同一时刻只有一个事务能修改某条数据,层实避免脏读、幻读、丢失更新...等问题。 适用于 库存扣减、订单处理 ...等业务,防止库存超卖、或数据篡改。 悲观锁的实现1.行级锁MySQL悲观锁,云服务器依赖于数据库提供的锁机制来实现,比如:MySQL的InnoDB存储引擎提供了行级锁,用于实现悲观并发控制。 常见的行级锁包括 :SELECT ... FOR UPDATE,如下所示: 复制START TRANSACTION; -- 开启事务 -- 查询用户余额,并加锁,防止其他事务修改 SELECT balance FROM accounts WHERE user_id = 1 FOR UPDATE; -- 更新用户余额 UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; COMMIT; -- 提交事务,释放锁1.2.3.4.5.6.7.8.9.10.11.12. 使用 SELECT ... FOR UPDATE 语句,对查询的行,加排他锁。 首先,事务 A ,先执行 SELECT ... FOR UPDATE,获取写锁; 然后,事务 B 试图执行 SELECT ... FOR UPDATE,会被阻塞,直到 事务 A 提交或回滚。 2.共享锁使用 SELECT ... LOCK IN SHARE MODE 语句对查询的行加共享锁,如下所示: 复制START TRANSACTION; -- 查询某个产品的库存,并加共享锁,防止其他事务修改 SELECT stock FROM products WHERE product_id = 1 LOCK IN SHARE MODE; COMMIT;1.2.3.4.5.6.7.8. 适用于只读操作,企商汇事务可以读取数据并加共享锁,其他事务仍能读取数据,但不能修改,直到共享锁释放。 3.表级锁表级锁:在事务操作过程中,对整张表进行锁定,以保证在整个事务操作期间该表不被其他事务修改。 复制LOCK TABLES products READ; -- 对 products 表加读锁 SELECT * FROM products; -- 允许多个事务同时读 -- 其他事务试图 UPDATE、INSERT、DELETE products 表时,会被阻塞 UNLOCK TABLES; -- 释放锁1.2.3.4.5.6.7.8.9.10. 相比于 行级锁(Row Lock),表级锁的粒度较大,会锁住整张表,从而降低了并发性能,但避免了死锁问题。 在数据一致性非常重要的场景中,例如:金融交易、或库存管理,悲观锁可以确保数据的准确性、和完整性,适合在并发量不高的环境。 |