怎么理解Java悲观锁与乐观锁

技术怎么理解Java悲观锁与乐观锁本篇内容介绍了“怎么理解Java悲观锁与乐观锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有

本文介绍了关于“如何理解Java悲观锁和乐观锁”的知识。很多人在实际案例操作中都会遇到这样的困难。接下来,让边肖带领大家学习如何应对这些情况!希望大家认真阅读,学点东西!

一个

在介绍悲观锁和乐观锁之前,我们先来看看什么是锁。

锁在我们的生活中随处可见。我们的门上有锁,我们存钱的保险箱上也有锁,用来保护我们的财产。

程序中也有锁。当多个线程修改一个共享变量时,我们可以同步修改操作。

当多个用户修改表中相同的数据时,我们可以锁定数据的行(行锁)。因此,锁实际上控制了并发下多个操作的顺序执行,从而保证了数据安全性的变化。

而且,锁是一种保证数据安全的机制和手段,并不特定于某一种技术。悲观锁和乐观锁也是如此。本文介绍的悲观锁和乐观锁都是基于数据库级别的。

怎么理解Java悲观锁与乐观锁

2

悲观锁

悲观并发控制,乍一看,相信大家都会认为是悲观锁。是的,它是一把悲观的锁。

这种悲观情绪体现在哪里?悲观主义是人类的一种负面情绪,与洛克的悲观主义相对应。悲观锁认为其保护的数据极其不安全,可能会一直变化。事务获得悲观锁(可以理解为用户)后,其他事务都不能修改数据,只能执行到锁被释放。

数据库中的行锁、表锁、读锁、写锁以及同步实现的锁都是悲观锁。

怎么理解Java悲观锁与乐观锁

在这里,我们再来介绍一下数据库的表锁和行锁,以免部分同学理解悲观锁的实现。

我们常用的数据库是mysql,mysql中最常用的引擎是Innodb,默认使用行锁。行锁是基于索引的,所以如果要添加行锁,就必须在锁的时候命中索引,否则就会使用表锁。

怎么理解Java悲观锁与乐观锁

乐观锁定

与悲观相对应,乐观是人类的一种积极情绪。乐观锁定的“乐观”体现在它相信数据不会变化太频繁。因此,它允许多个事务同时更改数据。

但是,乐观并不意味着不负责任,那么如何负责多个事务序列修改数据呢?

乐观锁定通常通过向表中添加版本或时间戳来实现,其中版本是最常用的版本。

当事务从数据库中检索数据时,它也将检索数据的版本(v1)。当事务更改数据并希望将其更新到表中时,它会将先前检索到的版本v1与数据中的最新版本v2进行比较。如果v1=v2,则意味着在数据更改期间,没有其他事务会修改数据。此时,允许事务修改表中的数据,版本将增加1,表示数据已被修改。

如果v1不等于v2,则意味着在数据更改期间,数据被其他事务更改。此时,不允许将数据更新到表中。一般的解决办法是通知用户重新操作。与悲观锁不同,乐观锁是人为控制的。

怎么理解Java悲观锁与乐观锁

如何实施

通过以上研究,我们知道悲观锁和乐观锁是用来控制并发数据的顺序变化的。然后我们模拟一个需要加锁的场景,看看不加锁会发生什么,以及如何使用悲观锁和乐观锁来解决。

场景:用户A和B最近都想吃猪肉干,于是打开购物网站,发现是同一家店在卖猪肉干。以下是本店商品表的结构和表中的数据。

怎么理解Java悲观锁与乐观锁

从表中可以看出,目前只有一个猪肉干。没有锁定,如果A和B同时下单,可能会导致超卖。

悲观锁定解决方案

使用悲观锁的解决思路是,我们认为数据修改冲突的概率比较高,所以在更新之前,我们表明应该锁定要修改的记录并释放锁,直到完成修改。锁定时只有自己可以读写,其他事务只能读不能写。

a .下单前给猪肉干的数据(id=1)添加悲观锁(行锁)。这时候,这一行数据只能由A来操作,也就是只有A才能买。如果你想买,你必须一直等下去。

A买的时候,B想再买的时候,会发现数量已经是0了,那么B看到之后就会放弃买。

那么如何给猪肉干的数据增加一个悲观锁,也就是id=1?我们可以通过以下语句向id=1的数据行添加悲观锁

selectnumrfomgoodsheid=1 for update;这里介绍一下“如何理解Java悲观锁和乐观锁”的内容。感谢您的阅读。如果你想了解更多的行业,可以关注网站。边肖将为您输出更多高质量的实用文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/102529.html

(0)

相关推荐

  • mac缩略图制作软件(mac图片编辑软件artstudiopro)

    技术电影缩略图制作工具Movie Thumbnails Maker for mac怎么用今天就跟大家聊聊有关电影缩略图制作工具Movie Thumbnails Maker for mac怎么用,可能很多人都不太了解,为了

    攻略 2021年12月24日
  • python如何对列表内数据求和(python如何对列表每一项求和)

    技术Python怎么实现多维列表求和本篇内容介绍了“Python怎么实现多维列表求和”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够

    攻略 2021年12月17日
  • 至于颠覆,物理学中有什么颠覆世界观的理论

    技术至于颠覆,物理学中有什么颠覆世界观的理论量子力学的诡异现象量子力学也是自然科学史上被实验证明最精确的一个理论,但是量子的观念,没有人能够理解至于颠覆。我说的没有人能够理解,绝不是指像我们这个层次的人,而是说连量子力学

    生活 2021年10月20日
  • 如何在scrapy请求异常之后再设置代理IP

    技术如何在scrapy请求异常之后再设置代理IP如何在scrapy请求异常之后再设置代理IP,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我们都知道 s

    攻略 2021年10月28日
  • 如何理解Oracle 12c CDB的ADG

    技术如何理解Oracle 12c CDB的ADG这篇文章将为大家详细讲解有关如何理解Oracle 12c CDB的ADG,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实验

    攻略 2021年11月29日
  • 怎么打出拼音声调,怎么打出汉语拼音声调符号

    技术怎么打出拼音声调,怎么打出汉语拼音声调符号打开WORD后怎么打出拼音声调,选择“插入→符号”,在符号→子集”选项里选择“进格的修饰字符”,里面就有汉语的声调符号.如图所示. 拼音声调
    拼音声调是指普通话中的声调,通

    生活 2021年10月21日