MySQL索引事务及高频面试题(2)

64 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

事务

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end ransaction语句(或函数调用)来界定。事务由事务开始(begintransaction)和事务结束(end transaction)之间执行的全体操作组成。(百度)

简单讲事务就是MySQL多条操作封装在一起,成为一个事务!!!

也就是多条sql语句就可以组成一个事务!

为什么使用事务

有些MySQL操作,不得不需要多条sql才能执行成功!

比如我们需要转账操作! 显然这样的操作,在mysql需要分两步执行!!!

假设:阿里巴巴需要给四十大盗转账2000元!! 在这里插入图片描述 第一步: 阿里巴巴账户余额减少2000! 在这里插入图片描述

第二步: 四十大盗账户余额增加2000 在这里插入图片描述

如果我们的第一步操作就失败了!显然此时转账失败了! 我们第二步的操作就没有意义了! 所以我们需要将这两个操作打包成一个事务! 如果sql_1执行成功了,那么再执行sql_2!

那如果sql_1执行失败了咋整呢? 放心,我们的mysql数据库有专门的表记录下了sql_1操作,数据库系统会自动将该操作回滚即复原!!!

事务特性:

四大特性:

  • 原子性 因为我们通常认为原子是不可再分的,这里就是认为事务是最小单元了!
  • 一致性 就刚刚的转账操作,账户1和账户2中的余额总数要和转账前相同,不能无故增加或减少!!!
  • 隔离性 多个事务并发之间是隔离的! 就是当,双方转账的同时,另一方再转账给其中一人,那么此时就不可执行!
  • 持久性 执行该条事务后,如果不进行二次更改,那么该数据就持久有效了!

使用

如何设置执行一个事务呢?

  • 开启事务 sql语句 start transaction;
  • 执行多条sql
  • 回滚或提交: sql语句 rollback/commit; rollback即是全部失败,commit即是全部成功。 在这里插入图片描述 commit事务提交成功!! 在这里插入图片描述 rollback撤销该事务

并发执行事务可能带来的问题(面试)

我们知道事务有隔离性的特点!!! 我们知道隔离性越好,那么事务之间的并发性就低!!!

什么是并发执行呢? 我们知道我们的计算机可以同时开启多个进程(程序)! 我们可以听着歌,打开IDEA,打开CSDN写博客!!! 我们计算机是很擅长一心多用!!多个进程并发执行!!! 而如今的计算机CPU也是取向多核发展!! 就是同时并发执行的程序可以更多!!

而事务间也有并发!

联系我们生活,很多事情我们可以同时并发执行!但是有些事情需要先后顺序执行,不然会很多问题!! 事务并发也是如此,有可能出现一些问题!

  • 脏读问题

什么是脏读呢? 顾名思义就是读了一个脏数据!就是错误的数据!!

什么情况下会出现脏读呢?

比如高中,考了考试,你正在订正答案,学委在黑板上抄答案,你在你的试卷上改!他写,你抄.你抄完后,发现学委把答案改了,他刚刚抄错答案了! 你刚刚读的答案就是一个脏数据!!!

我们画一个时间轴便于理解!!! 在这里插入图片描述解决方案: 我们可以对写操作进行加锁!!!便可以处理脏读问题!!!

就是说我们等学委将答案全部抄完! 我们再进行读答案!!! 在这里插入图片描述

  • 不可重复读

当我们学委写完答案,你开始抄答案不久时间后,老师和他说有一个答案有更好的解法!让学委重新写一份!可这时你已经在抄了好多了!你就一整个大无语!!!

在这里插入图片描述 解决方案: 给读操作加锁!

我们和学委商量,他写答案的时候我们不看!我们抄答案的时候他就不可以改了!!! 在这里插入图片描述

  • 幻读问题

当学委写完数学答案后,我们再看数学答案时,他又在写英文答案,此时你就看岔行了!把英文答案看成了数学答案抄了,出现了幻读问题!!!

在这里插入图片描述 解决方案: 再次和学委商量,咱抄答案时他不能写!!!我们抄时他不能写!!!

使读和写操作直接串行化了!!!

显然此时的隔离效果最后!! 但是并发最慢!!!

隔离性和并发两者需要平衡!!!