乐观锁和悲观锁

简介: 乐观锁和悲观锁

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

悲观锁:

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

其主要特点:

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

乐观锁:

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

其主要特点:

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

区别总结如下:

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

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

 

相关文章
|
Ubuntu 应用服务中间件 项目管理
部署gitlab详解
部署gitlab详解
部署gitlab详解
|
存储 JSON NoSQL
Node.js使用数据库LevelDB:超高性能kv存储引擎
Node.js被设计用来做快速高效的网络I/O。它的事件驱动流使其成为一种智能代理的理想选择,通常作为后端系统和前端之间的粘合剂。Node的设计初衷就是为了实现这一目的,但与此同时,它已成功用于构建传统的Web应用程序:一个HTTP服务器,提供为HTML页面或JSON消息响应,并使用数据库存储数据。
948 0
Node.js使用数据库LevelDB:超高性能kv存储引擎
|
JavaScript IDE 开发工具
python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
【5月更文挑战第14天】python中的SyntaxError: invalid character in identifier(语法错误:标识符中有无效字符)
1388 8
|
数据可视化 BI API
如何开放自己的API接口给他人调用并限制请求次数?
你将学到什么? 可以帮助你实现:将自己的API接入到果创云,然后创建子应用给到你的客户或你的开发者进行接口调用,并统计调用次数。平台暂时不支持线上结算,需要自己进行线下接口调用次数的内部结算。
|
机器学习/深度学习 自然语言处理
【大模型】如何处理微调LLM来编写创意内容?
【5月更文挑战第7天】【大模型】如何处理微调LLM来编写创意内容?
|
存储 算法
数据结构实验三 线性表的链式存储结构及实现
数据结构实验三 线性表的链式存储结构及实现
370 0
Java程序设计基础——分支结构详解
Java程序设计基础——分支结构详解
|
小程序 开发者 Windows
安装VantWeapp开发微信小程序
安装VantWeapp开发微信小程序
343 0
|
运维 Linux 数据安全/隐私保护
宝塔手把手教学-Linux面板安装LNMP & worldpress个人博客
宝塔手把手教学-Linux面板安装LNMP & worldpress个人博客
370 1
|
缓存 负载均衡 NoSQL
实战:Redis高负载排查记录
实战:Redis高负载排查记录
494 1