怎么理解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)

相关推荐

  • mysql如何实现查表空间大小的SQL语句

    技术mysql如何实现查表空间大小的SQL语句这篇文章将为大家详细讲解有关mysql如何实现查表空间大小的SQL语句,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    攻略 2021年10月30日
  • 张僧繇怎么读,张僧繇的点睛之笔指的是什么

    技术张僧繇怎么读,张僧繇的点睛之笔指的是什么张僧繇是梁朝著名的画师。有一次,皇帝命令他在金陵安乐寺的墙壁上画龙。不一会儿,两条栩栩如生的龙就出现在墙壁上了。这时皇帝发现这两条龙都没有眼睛,就问张僧繇这是为什么。张僧繇回答

    生活 2021年10月30日
  • JNA在Linux和MAC怎么编译C

    技术JNA在Linux和MAC怎么编译C这篇文章主要讲解了“JNA在Linux和MAC怎么编译C”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JNA在Linux和MAC怎

    攻略 2021年11月30日
  • java中的迭代器模式怎么实现

    技术java中的迭代器模式怎么实现小编给大家分享一下java中的迭代器模式怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!迭代器模式迭代

    攻略 2021年11月17日
  • 题目1有序数组的平方【 map和sort的使用 】

    技术题目1有序数组的平方【 map和sort的使用 】 题目1有序数组的平方【 map和sort的使用 】map()方法定义在JavaScript的Array中,它返回一个新的数组,新返回数组中的每个元

    礼包 2021年12月24日
  • 如何理解jmeter

    技术如何理解jmeter今天就跟大家聊聊有关如何理解jmeter,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 1. jmeter环境

    攻略 2021年11月17日