热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

面试常问之~悲观锁和乐观锁

我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,

   


 


        我们在开发中,有时候常常去实现一些业务的功能实现,往往忽略了很多源头的东西,这也是我身边有很多业务超级强的人,但是一旦跳槽以及面试会被一些东西卡掉,你要说他真的不知道吗?其实不是,只是很多东西,我们常用,但是没有深入去了解或者不能再面试时候给出官方的解释(这一点我真的很烦)下面就悲观锁和乐观锁给出我的理解,当然我也是面试经常会被问到,我一般都是按照自己理解去回答 ,从来不去官方解释(每个人不一样,只要大家觉得适合自己的就行.)

  一般面试官会从和几个点问你:

       1.什么是锁? 


       2.你知道悲观锁和乐观锁?

       3.你可以大概简单讲一下你的理解? 

  一般这三个问题是层层递进的,一般问道锁了 就心里要想了 ,千万不要不懂装懂,一定把自己最拿手最熟悉的说出来.好啦,进入正题.

   一: 首先理解锁:

              我的认为:锁的出现必定是因为并发才会有的东西,因为在并发的情况下,锁是来控制多个操作顺序,保证数据安全变动的一个很好的东西,锁一般最多是在: 多线程中的锁  和  数据库的锁.

比如在数据库层,一个表中同一个数据,同时多个修改操作过来,那数据库就会给表钟该行数据上锁,通常也叫行锁.我们今天说的悲观锁以及乐观锁是基于数据库层面的,跟程序中的多线程中的锁是不一样的.

       悲观锁:

              从字面意思来看,这家伙就是很悲观,我更喜欢叫它谨慎锁.从数据库层来讲:


1.去拿数据,会认为在此同时会有人也来动这个数据,所以它就会上锁.


2.这样,别人要是也操作这个数据,就需要它那边完事,释放锁之后.


   这个机制其实对应于我们常说你的    行锁 表锁  读锁  写锁 

  

乐观锁

      就是很乐观,我一般叫大意锁.从数据库层来讲:


 1.去拿数据,会认为在此同时不会有人也来动这个数据,所以它就不会上锁.


2.但是,不上锁不代表就会不负责,一般在最后更新数据的时候,一般使用版本号来处理.(问版本号如何处理?


         乐观锁通常是通过在表中增加一个版本或时间戳来实现,一般常用版本。

 例如:

   A操作数据库数据时候 

 1. 从数据库中取数据时附带了版本号 

 2. A操作后对数据有变动最后想要将其存到表中时,这个时候会将之前取出的数据中的版本号与数据库表中最新的版本号相对比,

 3.  如果两版本一样,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许A操作对表中的数据进行修改成功,同时会将版本号进行+1操作

 4. 如果不相等,那就证明有人动过该数据,就不准A操作成立,让其重新操作一遍.

 好啦,到这里 你会发现 他们两个虽然最后都保证了数据的安全,但是,如果一个数据被修改的情况很少,我们使用悲观锁每一次加锁势必耗时,所以,场景就出来了,一般的话乐观锁适用于写比较少的情况下,悲观锁适用于读比较少的情况下.


推荐阅读
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • 无论是在迁移到云服务还是更换云服务商的过程中,数据迁移都是一个至关重要的环节。本文将探讨数据迁移中可能遇到的问题及解决方案,包括路径问题、速度问题和数据完整性等。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • MySQL Server 8.0.28 升级至 8.0.30 的详细步骤
    为了修复安全漏洞,本文档提供了从 MySQL Server 8.0.28 升级到 8.0.30 的详细步骤,包括备份数据库、停止和删除旧服务、安装新版本以及配置相关环境变量。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • RocketMQ在秒杀时的应用
    目录一、RocketMQ是什么二、broker和nameserver2.1Broker2.2NameServer三、MQ在秒杀场景下的应用3.1利用MQ进行异步操作3. ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 本文旨在探讨信息安全专业的职业规划路径,结合个人经历和专家建议,为即将毕业的学生提供实用的指导。 ... [详细]
  • EST:西湖大学鞠峰组污水厂病原菌与土著反硝化细菌是多重抗生素耐药基因的活跃表达者...
    点击蓝字关注我们编译:祝新宇校稿:鞠峰、袁凌论文ID原名:PathogenicandIndigenousDenitrifyingBacte ... [详细]
  • 过去查询Mysql的时候,都见3306对所有端口开放着,感觉不安全。netstat -anlp | grep mysqltcp 0&am ... [详细]
  • 本文详细介绍了MySQL数据库服务器(mysqld)和客户端(mysql)的区别,并提供了多种启动和关闭MySQL服务器的方法。通过这些方法,您可以更好地管理和维护MySQL数据库。 ... [详细]
author-avatar
毕老爷666
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有