专栏首页醉程序悲观锁、乐观锁,浅析

悲观锁、乐观锁,浅析

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

悲观锁

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

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

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

一个典型的示例:

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

乐观锁

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

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

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

一个典型的示例:

-- 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 乐观锁与悲观锁

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java 反射

    万物皆对象,类也是个对象。foo是Foo的实例对象,那么Foo又是谁的实例对象呢? 是java.lang.Class的对象。任何一个类都是其对象。

    许杨淼淼
  • 申请Google Adsense, 结合Hugo配置

    申请Google Adsense终于审核通过了, 哈哈哈, 容我大笑一下下. 毕竟只是一个小小博客, 没什么访问量, 多数访问量还是这篇文章提供的. 主要记录以...

    许杨淼淼
  • 学习SpringBoot系列 -01- 移除parent依赖

    借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。

    许杨淼淼
  • 日媒总结中国发展AI的三大优势,称后者将超越美国 | 热点

    镁客网
  • 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:【swift学习笔记】一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据...

    lpxxn
  • PHP的多维数组排序

    熟悉PHP的小伙伴都知道有很多内置函数可以对数组进行排序操作或者自定义一些排序方法(冒泡)等等。

    用户2475223
  • MySQL输入密码后闪退的解决方法 原

    醉生萌死
  • 系统架构师论文-论计算机网络的安全性设计(证券网络交易系统)

    我在一家证券公司信息技术部门工作,我公司在97-98年建成了与各公司总部及营业网点的企业网络,并已先后在企业网络上建设了交易系统、办公系统,并开通了互联网应用。...

    cwl_java
  • gps轨迹模拟器的应用及优势总结

    gps轨迹模拟器应该具备完整的民用信号支持能力,适用于各类民用导航终端的研制、生产、测试和检定。

    时频专家
  • QPNP 8909 8916 充电相关(2)【转】

    上一篇主要讲电池相关的一些知识,上节忘记讲了,电池一般分为电量计电池和非电流计电池,电量计电池,就不需要用pmu8916的IC,当然这只是只,不需要BMS来计算...

    233333

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动