乐观锁和悲观锁

简介: 乐观锁和悲观锁

乐观锁和悲观锁是并发控制的两种不同策略,用于解决多个线程或进程同时访问共享资源时可能出现的数据一致性问题。

悲观锁:

  • 悲观锁的核心思想是假设并发访问会导致数据冲突,因此在访问之前会将资源进行加锁,确保其他线程无法修改数据。
  • 当线程想要访问共享资源时,它会直接获取锁,其他线程需要等待锁被释放才能继续执行。
  • 悲观锁适用于并发冲突较多的情况下,可以保证数据的一致性,但是会降低系统的并发性能。例如对数据更新频繁、冲突概率高的场景,例如数据库中的行级锁。

其主要特点:

  1. 在操作之前获取锁,并在整个操作过程中持有锁,确保只有一个事务能够访问被锁定的资源。
  2. 其他事务需要等待锁的释放才能执行操作,可能会导致一些事务等待时间较长。
  3. 可以保证数据的一致性和安全性,因为同一时间只有一个事务能够修改被锁定的资源。

乐观锁:

  • 乐观锁的核心思想是认为并发访问不会导致数据冲突,因此在线程试图提交数据时才检查是否有冲突。如果有冲突,则回滚并重试。乐观锁适用于并发冲突较少的情况下,可以提高系统的并发性能,但是可能会导致一些重试操作。
  • 在访问共享资源时,并不对其进行加锁,而是通过记录版本号、时间戳等方式标识数据的状态。
  • 当要提交数据时,会比较版本号等信息,如果发现数据已被其他线程修改,则认为发生了冲突,需要进行相应的处理。
  • 乐观锁适用于读操作比写操作频繁、冲突概率低的场景,例如缓存系统中的CASCompare and Swap)操作。

其主要特点:

  1. 在操作之前不获取锁,允许多个事务同时访问同一资源。
  2. 在提交操作时检查是否有冲突,如果有冲突则回滚并重试。
  3. 可以提高系统的并发性能,因为多个事务可以同时执行操作而不需要等待锁的释放。

区别总结如下:

  • 悲观锁假设会有冲突发生,因此在访问资源之前进行加锁,而乐观锁假设不会有冲突发生,只在提交时检查是否有冲突。
  • 悲观锁会阻塞其他线程的访问,直到锁被释放,而乐观锁不会阻塞其他线程的访问,但在提交时可能会回滚或重新尝试。
  • 悲观锁适合于冲突概率高的场景,乐观锁适合于冲突概率低的场景。

需要根据具体的场景和业务需求来选择使用悲观锁还是乐观锁。

 

相关文章
|
6月前
|
消息中间件 安全 Java
什么是乐观锁、在哪用过乐观锁
什么是乐观锁、在哪用过乐观锁
166 0
|
6月前
|
SQL 数据处理 数据库
乐观锁和悲观锁
乐观锁和悲观锁
66 0
|
2月前
|
SQL XML Java
乐观锁与悲观锁是什么?
本文详细分析了悲观锁和乐观锁的原理、区别、实现方式及应用场景。悲观锁假设冲突频繁,通过加锁保护数据一致性,适用于高并发冲突场景;乐观锁假设冲突较少,通过版本号或时间戳检测冲突,适用于读多写少场景。文章通过具体示例展示了两种锁机制的实现过程,并总结了其优缺点和适用场景,帮助读者根据实际需求选择合适的并发控制机制。
203 3
|
3月前
|
SQL 缓存 NoSQL
乐观锁的实现
乐观锁的实现
|
Java API 数据库
什么是乐观锁,什么是悲观锁?
在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。
126 0
|
4月前
|
数据库
乐观锁介绍
乐观锁介绍
|
6月前
|
安全 Java 关系型数据库
乐观锁与悲观锁
【4月更文挑战第11天】乐观锁与悲观锁
43 3
|
6月前
|
关系型数据库 MySQL 数据处理
一文彻底理解乐观锁与悲观锁
一文彻底理解乐观锁与悲观锁
779 0
|
6月前
|
安全 关系型数据库 MySQL
悲观锁和乐观锁
悲观锁和乐观锁
|
NoSQL 算法 Java
乐观锁与悲观锁的实现
本文力求来通俗地讲讲编程中的乐观锁和悲观锁,以及分别是怎么实现的。
97 0
乐观锁与悲观锁的实现