在MySQL中,乐观锁与悲观锁分别指什么?请解释它们的实现原理与适用场景。
考察说明
考查对MySQL并发控制中两种锁机制的理解与应用区分。
回答思路
- 【回答框架 1】悲观锁基于数据库内置锁机制,在操作前先加锁以保证数据一致性,例如使用select for update或普通行锁;其特点是强一致性但并发性能较低,适用于写冲突频繁的场景。
- 【回答框架 2】乐观锁不依赖数据库锁,而是通过版本号或时间戳等字段在更新时校验数据是否被修改,若版本不匹配则更新失败需重试;其特点是无锁操作且并发性能较高,适用于读多写少、冲突较少的场景。
- 【回答框架 3】实现悲观锁时需注意锁范围与事务边界,避免长时间持锁导致阻塞;实现乐观锁时需设计版本字段的更新策略与重试机制,并考虑ABA问题及重试成本。
- 【回答框架 4】选择依据主要看业务并发冲突概率:冲突多且对一致性要求高可选悲观锁,冲突少且追求吞吐可选乐观锁。
- 【关键点 1】悲观锁使用数据库锁如select for update实现,强调事前互斥。
- 【关键点 2】乐观锁通过版本号或时间戳在更新时校验变更,强调事后检查。
- 【关键点 3】悲观锁适合写冲突多的场景,乐观锁适合读多写少的场景。
- 【关键点 4】乐观锁需处理更新失败后的重试逻辑,避免无效更新。
- 【易错点 1】不能将乐观锁误认为可完全脱离数据库约束,仍需唯一键等保证最终一致。
- 【易错点 2】悲观锁并非在事务未提交时锁被释放,需理解锁在事务提交或回滚后才释放。
- 【易错点 3】乐观锁重试可能带来额外开销,需结合冲突率权衡。