MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合:

一同进行深入研究。

在进行MySQL事务讲解之前,我们先来一个银行转账的案列,将会通过这个案列带领大家深入了解事务的概念,特性等知识~~

经典的场景:银行转账~

用户1给用户2进行转账500money~

用户1给用户2进行转账500money~
account(id, balance)
         1   1000
         2     0
操作1:
update account set balance = balance-500 where id=1;
操作2:
update account set balance = balance+500 where id=2;

假设哈,假设~,在执行转账的过程中,执行完操作1以后,数据库崩溃/主机宕机,此时转账就僵硬了(操作1的钱扣了,操作2的钱没有正常到账)~~

那么事务,就是为了解决上述的问题~,事务的本质是把多个sql语句打包成一个整体(事务的原子性),要么全部都执行,要么就一个都不执行,而不会出现“执行一半的中间状态。

其实不是真的没执行,而是看起来好像跟没执行一样;
执行一半出错了,出错之后选择了恢复现场,把数据还原成未执行之前的状态了!
————》类似于CTRL+Z(撤销)
这个恢复数据的操作叫做”回滚“

上面的这个银行转账案列跟淘宝买东西一个道理:如:淘宝买东西,下单的同时需要支付,若账户已扣钱,但是没有生成相对的订单表~~尴尬了这就!!

那么,我们回过来接着看一下刚刚的银行转账问题(操作1的钱扣了,操作2的钱未正常到账)

操作1:
update account set balance = balance-500 where id=1;
操作2:
update account set balance = balance+500 where id=2;

如果把这两个操作作为一个事务,当第一个sql执行完以后,数据库崩溃,当下次数据库重新启动完之后,就会自动的把上次修改一半的数据给进行还原(把操作1过程的-500元,再给+回来)。

进行回滚的时候,咋知道回滚是恢复到啥样的状态呢??

此时是需要额外的部分来记录事务中的操作步骤(数据库里专门有个用来记录事务的日志)正因为如此,使用事务的时候,执行sql的开销是更大的,效率是更低的~~

开启事务/提交事务:

开启事务:
start transaction;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~中间部分就是要执行的每一步操作
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
提交事务(到这一步,相当于事务就执行完了
commit;

如下述代码操作:

start transaction;
阿里巴巴账户减少2000
update account set money = money-2000 where name="阿里巴巴”;
四十大盗账户增加2000
update account set money = money+2000 where name="四十大盗”;
commit;

大家看着上述的银行转账案列很容易,但是理解起来却是很困难~

那么接下来我们来看一下数据库的事务,四大特性(八股文,经典面试题)

  1. 原子性,(最核心的特性)初心
  2. 一致性,事务执行前后,数据得是靠谱的(转账金额)
  3. 持久性,事务修改的内容是写到硬盘上的,持久存在的,重启也不会丢失
  4. 隔离性,这个隔离性是为了解决“并发”执行事务,引起的问题

~~~~~~~~~~~~~最难搞的面试题~~~~~~~~~常考~~~~~~~~~~~~

我们先来了解一下并发:并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。——————内容来自百度百科~~

我们来举例说明一下并发

在一个餐馆(服务器)同一时刻要给多个顾客(客户端)提供服务,这些顾客提出的请求是“一个接一个的?”,还是“一股脑来了一大批呢?”,此时服务器同时处理多个客户端的请求,称为“并发”(齐头并进)

引起的问题有哪些呢??如果并发的这些事务是修改不同表/不同的数据,那么,没啥事,如果修改的是同一表/同一数据,可能会带来一定的问题,比如:多个客户端一起尝试对同一个账户进行转账操作,此时,就可以会把这个数据搞混了~

隔离性:事务的隔离性存在的意义是为了:在数据并发处理事务的时候,不会有问题(即使有问题,那么该问题也不大~)。

接下来说说:并发处理事务,可能会遇到哪些问题??以及这些问题数据库的隔离性是怎样解决的??(其实这个还是挺麻烦的,需要大家多理解理解)

并发执行事务可能产生的问题

  1. 脏读问题
  2. 不可重复读
  3. 幻读

接下来,我们来看一下并发执行事务可能产生的三大问题吧~

1.脏读问题:

一个事务A正在对数据进行修改的过程中,还没提交之前,另一个事务B也对同一个数据进行了读取,此时B的读操作,就称为“脏读”,读到达数据也成为“脏数据”,此时所说的脏是指“无效的数据”,为啥说无效呢??原因在于:A可能回头把数据给改了~~(事务B读到的数据不一定是最终结果,可能是无效的数据

那么,我们又该如何取解决脏读问题呢??

MySQL写了“写操作加锁”这样的机制~

当事务A修改数据到时候,事务B不能读数据,此时,事务A的“写操作”与事务B的“读操作”就不能并发了(不能同时执行了)

“写加锁操作”降低了并发程度(降低了效率)提高了隔离性(提高了事务的准确性)

2.不可重复读

事务1已经提交了某数据,此时事务2开始去读数据,在读取的过程中,事务3对该数据进行了修改,并提交了新的数据,此时意味着:同一个事务2,多次读数据,读出来的结果是不相同的~(预期是一个事务中,多次读取结果得是一样的),此时,叫做“不可重复读”(第二次读取的结果,不能复现第一次的结果

为了解决这个问题,MySQL引入“读加锁操作”

通过读加锁,又进一步降低了事务的并发处理能力(处理效率也降低了),提高事务的隔离性(数据的准确性又提高了~)

3.幻读

在读加锁和写加锁的前提下,一个事务两次读取同一个数据,发现读取的数据值是一样的,但是结果集不一样(student.java 代码内容不变,但是第一次看到的只有student.java文件,第二次看到的是student.java和teacher.java这两个文件),这种问题就是幻读

那么,又该如何解决幻读出现的问题呢??

数据库使用“串行化”这样的方式来解决幻读,彻底放弃并发处理事务,一个接一个的串行的处理事务,这样做,并发程度是最低的(效率最慢的),隔离性是最高的(准确性是最高的)。

上述三个问题:脏读(给写加锁),不可重复读(给读加锁),幻读(彻底串行化)就是并发处理事务三个典型的问题~

对应上述问题MySQL提供四种隔离级别,对应上面的几个情况

  1. read uncommitted : 没有进行任何锁限制,并发最高(效率最高),隔离性最低(准确性最低)~
  2. read committed :给写加锁,并发程度降低,隔离性提高了~
  3. repeatable read :给写和读加锁,并发程度又降低了,隔离性又提高了~
  4. serializable :串行化,并发程度最低,隔离性最高~

上述的四个各类级别,都是MySQL内置的机制,可以通过修改MySQL的配置文件,来设置当前MySQL工作在哪种状态下~

对于上述的三个问题(脏读,不可重复读,幻读),没有办法通过代码来讲解

  1. 当前没有办法构造并发代码(涉及到多线程,笔者暂时不会嗨~~)
  2. 读加锁与写加锁啥的,都是MySQL内部的机制,不是代码~~

那么,对于上述的四个级别,该如何选择??

其实这几个级别之间没有好坏之分,这就需要开发者在准确性和效率之间进行权衡,看实际需求,看业务场景~~

  1. 场景1:转账的时候,一分钱都不能差,哪怕慢点,也得转对,准确性要拉满,效率不关键
  2. 场景2:抖音点赞,一个视频有多少赞?要求快,赞的数量差十个八个的,都没啥事,追求的是效率,准确性就不怎么关键~
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
3天前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
4天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
5天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
19 3
|
5天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
24 3
|
5天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
29 2
|
18天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
131 15
|
12天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
9天前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
19天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。