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