前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >悲观锁、乐观锁,浅析

悲观锁、乐观锁,浅析

作者头像
许杨淼淼
发布2019-12-29 20:09:09
5040
发布2019-12-29 20:09:09
举报
文章被收录于专栏:醉程序

悲观锁和乐观锁是并发控制常用的两种技术手段。 并发控制是用来确保 多个事务同时读写DB中同一条数据时不破坏事务的隔离性、统一性以及数据库的统一性。

悲观锁

悲观锁 (Pessimistic Lock),又称悲观并发控制 (Pessimistic Concurrency Control)

对数据的处理保持悲观的心态。在数据处理过程中,利用数据库层提供的锁机制,始终将数据置于锁定状态,直至处理完成。

悲观锁的流程如下: 1. 在数据更新前对该待更新数据加排他锁 2. 若加锁失败,说明该条数据正在被更新,则等待解锁或抛异常 3. 若加锁成功,则开始更新操作,事务完成后解锁。期间若其它事务尝试更新该数据则会等待解锁或抛异常

一个典型的示例:

代码语言:javascript
复制
-- 0. 开始事务
-- 1. 使用 select ... for update 加锁 (需要注意 where 内字段需要加索引否则会锁表)
select id from table_name where id=1 for update;
-- 2. 更新操作
-- 3. 提交事务

乐观锁

乐观锁 (Optimistic Locking),又称乐观并发控制 (Optimistic Concurrency Control)

对数据的处理保持乐观的心态。假定在更新数据时不会有其它事务同时来更新。只在数据更新时进行判定,若与预期不符合则不进行更新。

一般实现乐观锁的方式是记录数据版本,实现数据版本有两种方式: 版本号和时间戳。

一个典型的示例:

代码语言:javascript
复制
-- 1. 查询信息
select id,type,version from table_name where id=1;
-- 2. 更新操作
update table_name set type=2,version=version+1 where id=1 and version=version; 

乐观锁因锁的时间短(只发生在update时),与悲观锁相比效率会更高一些(支持更高的并发量),但同样因此可能存在ABA的问题。

参考

  1. 深入理解乐观锁与悲观锁
  2. MySQL 乐观锁与悲观锁
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年3月7日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 悲观锁
  • 乐观锁
  • 参考
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档