乐观锁,悲观锁

乐观锁,悲观锁
最新回答
网瘾少女裤裆藏雷

2021-09-09 21:54:22

乐观锁和悲观锁是两种常见的并发控制机制

乐观锁

  • 定义:基于乐观的并发控制思想,假设事务间的冲突概率较低,因此不对资源加锁。在更新数据时,通过某种机制(如版本号或时间戳)来检测是否发生了冲突,如果检测到冲突,事务会回滚或重试。
  • 实现方式:在表中增加一个版本号字段(version)或时间戳字段。读取数据时一并读取版本号。更新时将版本号作为条件,如果版本号没有变化,则允许更新;否则,更新失败。
  • 特性

    优点:无需加锁,对读取操作没有阻塞,性能较高。适合读多写少的场景。

    缺点:如果发生冲突,可能需要多次重试,增加了应用程序的复杂度。

悲观锁

  • 定义:基于悲观的并发控制思想,假设事务间的冲突概率较高,因此对资源加锁以避免冲突。在读取数据时直接加锁,确保其他事务无法修改或读取该数据。
  • 实现方式:通过数据库提供的锁机制(如共享锁(S 锁)或排他锁(X 锁))来实现。
  • 特性

    优点:通过锁机制保证数据一致性,不需要额外的版本检测。适合写多读少或高并发更新的场景。

    缺点:会阻塞其他事务的操作,可能导致性能降低。容易发生死锁,需要特别注意加锁顺序。

乐观锁与悲观锁的对比

  • 加锁机制:乐观锁不加锁,通过版本号或时间戳控制并发;悲观锁通过数据库锁机制加锁。
  • 适用场景:乐观锁适合读多写少、冲突概率低、对系统性能要求较高的场景;悲观锁适合写多读少、冲突概率较高、需要严格的数据一致性的场景。
  • 并发性能:乐观锁性能较高,无锁操作;悲观锁性能较低,可能阻塞其他事务。
  • 冲突处理:乐观锁冲突时需要回滚或重试;悲观锁无冲突,直接完成事务。
  • 实现复杂度:乐观锁需要应用逻辑支持(版本号或时间戳);悲观锁数据库原生支持。
  • 事务阻塞:乐观锁不会阻塞其他事务;悲观锁可能阻塞其他事务。

如何选择

  • 在读操作频繁、写操作较少、数据冲突概率较低、对系统性能要求较高的场景下,适合使用乐观锁。
  • 在写操作频繁、冲突概率较高、需要严格的数据一致性、数据库支持较好且可以接受一定的阻塞的场景下,适合使用悲观锁。

通过选择合适的锁机制,可以在性能和一致性之间找到平衡,以满足不同场景下的需求。