当前位置: 首页 > 图灵资讯 > java面试题> 初级java面试题-什么是乐观锁和悲观锁?

初级java面试题-什么是乐观锁和悲观锁?

来源:图灵教育
时间:2024-07-25 13:13:49

在多用户访问和修改同一个数据库资源时,可能会产生冲突。为了避免这些冲突,我们需要使用某种机制来管理并发访问。乐观锁和悲观锁就是两种常见的并发控制机制。

悲观锁(Pessimistic Lock)

悲观锁的想法是“悲观”的,认为每次访问数据时都会有冲突。因此,在操作数据之前,先把数据锁住,其他用户在这个锁释放之前无法访问这个数据。

  • 使用场景:当你预期数据会有高频率的冲突和修改时,使用悲观锁比较合适。
  • 实现方式:数据库提供了多种锁机制,比如行锁、表锁等。在操作数据之前,先加锁,操作完成后再释放锁。
  • 优点:可以完全避免并发修改带来的数据不一致问题。
  • 缺点:锁会导致其他用户等待,降低系统的并发性能和响应速度。

乐观锁(Optimistic Lock)

乐观锁的想法是“乐观”的,认为大多数情况下数据不会产生冲突。因此,在操作数据时不加锁,而是在提交时检查数据是否被其他用户修改过。如果没有修改过,就提交成功;如果已经被修改过,就回滚操作并提示用户重新操作。

  • 使用场景:当你预期数据冲突较少,读多写少的情况下,使用乐观锁比较合适。
  • 实现方式:通常通过版本号或时间戳来实现。在读取数据时,带上版本号或时间戳,更新数据时检查版本号或时间戳是否一致。如果一致,说明数据没有被修改过,可以提交;如果不一致,说明数据已经被修改过,需要重新读取数据再操作。
  • 优点:不需要加锁,能提升系统的并发性能和响应速度。
  • 缺点:在高并发写操作时,可能会频繁出现冲突,导致重试次数增加,影响性能。

总结

  • 悲观锁:在操作数据之前加锁,适用于高频率冲突的场景,能完全避免数据不一致问题,但会降低并发性能。
  • 乐观锁:不加锁,通过版本号或时间戳来检测冲突,适用于读多写少的场景,能提升并发性能,但在高并发写操作时可能会频繁重试。