《面试季》经典面试题-数据库篇(三)

举报
IT学习日记v 发表于 2022/03/29 22:37:38 2022/03/29
【摘要】 面试季-经典面试题数据库第3篇,本专栏意在分享面试中常见的各种面试真题!目的是为了更好应对各厂裁员和跳槽涨薪问题,提前准备,不断学习!

  • 💂 个人网站: IT学习日记
  • 🤟 版权: 本文由【IT学习日记】原创、需要转载请联系博主
  • 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦

前言

  • 大家好,这里是IT学习日记,相信大家对今年IT的行情应该也有所了解了,从大厂到小厂,各种裁员消息。公司裁员我们无法决定,我们能做的就是不断提升自己,提前准备。

  • 本系列文章主要分享了之前博主真实面试中遇到的一些问题,希望能够帮助准备就业或者跳槽的朋友。

一、使用场景

  (一)你是否在平常的编码或者面试中会遇到以下疑问,如果有,那么就继续往下看,也许文章能够帮你解决一些疑惑。

  • 1、在平常的工作中有使用过事务?

  • 2、事务有什么特性,具体的含义是什么?

  • 3、事务的隔离级别会导致什么问题,能够举例说明?

二、定义

  (一)前言: 很多人会有疑问,为什么我不直接了当的将他们的区别列出来就可以了?为什么我会写这么长的文字去讲述他们的前因后果?

  我觉的学习一个知识点的时候,我们如果能够知道这个知识的前因后果,那么在使用的时候才不会一知半解,如果只是单单知道了这个知识,可能别人换一种方式询问,你可能又不知道怎么回答了。

  (二)就比如:事务的隔离级别的,可能直接问你事务隔离级别有哪些,你可以马上回答出来,但是如果别人询问,在代码中,为什么同一个事务中,没有修改过数据,两个相同的查询条件却查询出来不一样的数据,这个是什么原因,可能你一时就不知道怎么回答。

  这个是我自己个人遇到问题后的一个感悟,所以我所写的每一篇文字都会尽量将知识点讲得更清楚,而不是简单的一笔带过,如果你也有类似的感觉,那么请继续往下看,如果不是,则可以直接通过目录跳转到你感兴趣的地方。

  (一) 在平常的工作中有使用过事务?

  1、定义: 事务即多个对数据库操作的集合,这些操作要么一起成功,要么一起失败。

  2、使用场景: 当对存在多个对数据库的操作的时候,这些操作要么一起成功,要么一起失败时就可以使用到事务。

  3、案例:如创建一个订单的时候,需要减去库存,那么这两个对数据库的操作必须同时成功或者失败,不然就会出现订单创建失败但是却减去了库存,或者创建订单成功却没有减去库存的问题。

  (二) 事务有什么特性,具体的含义是什么?

  答:事务的基本特性有: ACID,具体含义如下:

  1. 原子性(Atomicity): 表示事务是一个不可分割的工作单位,事务中的操作要么全部成功、要么全部失败。如: 创建订单、扣减库存是同时成功或者同时失败

  2. 一致性(Consistency): 表示事务操作前后的数据完整性要保持一致。如: A账户有30块,转了10块给B账户,事务前后总的金额还是30块,不会随着A转移到B账户就导致数据完整性不一样了

  3. 隔离性(Isolation): 并发情况下操作数据库时,多个事务之间是相互隔离的,操作是互相不影响的,可以通过设置隔离级别来控制,具体下面会举例说明。如: A事务修改了C记录的年龄,B事务同时读取C记录的年龄,这时候B事务读取到的年龄还是A事务修改之前的,因为A事务没有提交(这个案例是以:Mysql数据库进行举例,默认的隔离界别是可重复读)

  4. 持久性(Durability): 事务对数据库的数据影响是永久的,只要提交了事务,那么数据库的数据就被更改了,即使数据库出现故障,也不会对这个数据造成影响。如:A事务修改了张三的年龄为1000岁,并提交了,那么即使这个数据是不对的,但是张三的年龄也只能是一千岁了(笑…)

  5. 注意: 事务在提交之前是可撤回的如:张三开启事务后准备给李四转1万块钱,但是在提交之前他又回滚了,直接调用事务的撤回(rollback),那么李四账户里面是不会收到张三转过来的钱的。

  (三) 事务的隔离级别会导致什么问题,能够举例说明?

  一: 事务的隔离级别分为:

  • 1、读未提交(Read Uncommitted): 会导致脏读、不可重读读、幻读问题。

  • 2、读已提交(Read Committed): 会导致不可重读读、幻读问题(PostgreSQL数据库默认的隔离级别)。

  • 3、可重复度(Repeatable Read): 会导致幻读问题(Mysql数据库默认的数据库隔离级别)。

  • 4、串行化(Serialized):不存在任何问题,但是这个效率非常低,同一时刻只能有一个用户可以操作数据库,只有这个用户操作完了,其他的用户才能进行操作。

  二 不同的事务隔离级别会导致的问题:

  1、脏读: 一个事务读取到另一个事务未提交的数据。如: 张三说还李四一万块,开启事务之后就将钱转给李四,然后打电话叫李四看钱到没,李四查看说到了,然后张三直接回滚事务(rollback),既事务内所有的操作都放弃,张三自己账户的钱没扣,却说已经还给李四了,李四再查看,发现自己的账户没有转入的钱,只能当冤大头

  2、不可重读读: 在同一个事务下,多次读取同一个记录但返回的数据不一样(这个是针对:更新操作)。如: A,B两个事务同时访问数据库,B事务查询数据库发现A账户还有一万块钱,此时A事务购买了东西,账户被扣了五千元,B忘记了账户还有多少钱,再查看,发现卡上只有五千元了,这种情况就是不可重复读

  3、幻读: 在同一个事务中,多次读取的数据数目前后不一致(这个主要是针对: 添加和删除操作)。如: A,B两个事务同时操作数据库中,A查询表发现还有10个记录,此时,B事务删除了两条,并提交了事务,A事务再查看发现少了两条记录,就感觉自己出现了幻觉一样,这个就是幻读。

三: 举例说明

  (一): 注意事项(以Mysql数据库为例,开启两个控制台进行测试)

   1、查询Mysql默认的数据库隔离级别:

(1)、mysql5.7以后: show variables like 'transaction_isolation';或者select @@transaction_isolation;
(2)、mysql5.7以前: show variables like 'tx_isolation';或者select @@tx_isolation;

查询事务的隔离级别

  2、修改数据库隔离级别(修改后需要退出重新登录才生效):

set global tx_isolation='read-uncommitted(填写隔离级别)';  

修改数据库隔离级别

  3、脏读现象测试:

   (1): 设置隔离级别为Read-Uncommitted

   (2): 测试数据

在这里插入图片描述

  4、不可以重复读现象测试:

  (1): 设置隔离级别为Read-Committed

设置隔离级别

  (2): 测试数据

不可重读测试

   4、幻读现象测试:

   (1): 设置隔离级别为Repeatable-Read
在这里插入图片描述

  (2): 测试数据

不可重读现象测试

   5、延伸知识:

  (1): MVVC机制: 既多版本并发控制 ,是现代数据库(包括 MySQL, Oracle ,PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于提高 数据库高并发场景下的吞吐性能 (后续文章会有更详细的介绍)。

  (2): undo log: 我们在这里可以将undo log抽象地理解为一种缓存机制 ,我们只要保证这个“缓存”在事务开始时是最新数据的缓存,并记录该缓存版本号,即使在事务执行过程中有其他事务提交数据的增删改操作,也不会影响到该版本号“缓存”的数据。

  在事务中执行不加锁的select操作时,会直接从“缓存”中拿数据;在事务中执行增删改时,会更新undo log中影响的数据行的信息,而若在第一次查询和更新之间的时间范围内,有其他事务提交了插入数据的操作,且更新时的条件覆盖了插入的数据,则会导致幻读;而对查询语句加锁,则会直接从库中查数据,加锁查询并不会更新快照。

小结

   不积跬步,无以至千里;不积小流,无以成江海。今天播种努力的种子,总会有一天发芽!

   欢迎大家关注,如果觉得文章对你有帮助,不要忘记一键三连哦,你的支持是我创作更加优质文章的动力,希望大家都能够早日拿到心仪的Offer,有任何面试问题可以私信我,欢迎大家投稿面试题目哦!


  该篇文章已经被收录在个人开源专栏:《IT知识小屋》中。专栏以小白视角切入,讲解通俗易懂,内容包含IT各方向知识(JAVA基础、进阶、面试真题、算法、面试采坑经验、996公司等),是IT知识学习+面试首选IT小屋。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。