专栏首页强仔仔Java 中的悲观锁和乐观锁的实现

Java 中的悲观锁和乐观锁的实现

一、定义

1.悲观锁:即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录锁掉,这样别人就没法改这条数据了,一直到你的锁释放。

2.乐观锁:即很乐观,查询数据的时候总觉得不会有人更改数据,等到更新的时候再判断这个数据有没有被人更改,有人更改了则本次更新失败。

二、实现过程

2.悲观锁:悲观锁的实现采用的数据库内部的锁机制,一个典型的倚赖数据库的悲观锁调用:

select * from account where name=”张三” for update

这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。也就是我们可以在查询数据的时候先用for update把这条数据锁住,然后更改完这条数据再提交。这样别的线程没法更新这条数据,也就保证了不会丢失更新。

2.1.悲观锁带来的性能问题。我们试想一个场景:如一个金融系统,当某个操作员读取用户的数据,并在读出的用户数据的基础上进行修改时(如更改用户帐户余额),如果采用悲观锁机制,也就意味着整个操作过程中(从操作员读出数据、开始修改直至提交修改结果的全过程),数据库记录始终处于加锁状态,可以想见,如果面对几百上千个并发,这样的情况将导致怎样的后果?所以我们这个时候可以使用乐观锁。

1.乐观锁:乐观锁的实现可以通过在表里面加一个版本号的形式,下面是一个实例。

讲解:也就是每个人更新的时候都会判断当前的版本号是否跟我查询出来得到的版本号是否一致,不一致就更新失败,一致就更新这条记录并更改版本号。

二、使用场景

像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

三、另一种的乐观锁实现方法叫做CAS,具体请参照:https://www.cnblogs.com/qjjazry/p/6581568.html

原理其实和上面说的是一样的,也是通过类似版本号这种模式来进行判断的,不过CAS是在内存中实现这个版本号判断的。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DbVisualizer破解教程

    今天给大家介绍一下DbVisualizer破解过程 第一步:把下载的dbvis.puk文件,替换掉安装目录“D:\Program Files\DbVisual...

    用户1149268
  • SpringBoot中Mybatis时区问题

    最近遇到一个巨坑的bug,mybatis打印出来sql日志显示数据入库成功,但是数据库查询却怎么也查询不到数据,debug日志打了一堆,硬是没发现任何问题。

    用户1149268
  • Java自定义注解实现和企业级应用

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1149268
  • 【计算机基本概念】如何理解内存?

    内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被...

    程序员互动联盟
  • 左手用R右手Python系列——数据塑型与长宽转换

    今天这篇是R语言 with Python系列的第三篇,主要跟大家分享数据处理过程中的数据塑型与长宽转换。 其实这个系列算是我对于之前学习的R语言系列的一个总结,...

    数据小磨坊
  • Logistic回归基础篇之梯度上升算法

    作者:崔家华 编辑:赵一帆 一、前言 本文从Logistic回归的原理开始讲起,补充了书上省略的数学推导。本文可能会略显枯燥,理论居多,Skle...

    机器学习算法工程师
  • 对于打算入门数据分析的菜鸟来说,你想提醒他们什么?

    “面对大数据时代趋势和与之相对的高薪,越来越多没有怎么学过计算机和统计学的外门人士也想跃跃欲试踏进数据科学的领域,请问大家伙儿有没有点建议想提醒新人呢。比如一路...

    小莹莹
  • 关于数据分析那些事,看这一篇文章就够了

    数据分析是基于商业目的,有目的的进行收集、整理、加工和分析数据,提炼有价信息的一个过程。

    华章科技
  • 初识计算机和编程简单运用

       能够执行的操作:+加  -减   *乘   //正除   **次方   %取模

    用户2398817
  • 让大数据更好服务民生

    今年,全国社保卡持卡人数突破10亿,覆盖超过72%的人口。这10亿张社保卡,承载的数据绝对够“大”,怎样用好这个数据宝库,更好地完善制度、提供服务?在民生领域,...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动