首页 > 数据库 >MySQL基础篇(一)

MySQL基础篇(一)

时间:2024-07-29 11:07:45浏览次数:10  
标签:执行器 事务 读取 幻读 基础 脏读 MySQL 数据

1. 事物的四大特性

事务是逻辑上的一组操作,要么都执行,要么都不执行

  • 原子性(Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  • 一致性(Consistency):执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  • 隔离性(Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  • 持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

2. MySQL事物的四个隔离级别

2.1 隔离级别

  • 读取未提交 :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • 读取已提交 :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • 可重复读 :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • 可串行化 :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

2.2 各隔离级别可能会导致的问题

隔离级别脏读不可重复读幻读读取未提交可能出现可能出现可能出现读取已提交解决可能出现可能出现可重复读 解决解决可能出现可串行化 解决解决解决

3. 事物的脏读、幻读、不可重复读

3.1 脏读

A事物读取表中数据为500
B事物将表中数据修改为350,未提交
A事物再次读取数据为350
B事物回滚

此时数据库中数据仍为500,认为A事物第二次读到的数据为脏数据

3.2 幻读

幻读是指一个事务在多次查询中返回了不一致的结果。例如,假设有两个事务C和D,C首先按照某个范围条件(如id>10 and id<20)查询了表中的数据,然后D在这个范围内插入了新的数据。当C再次查询这个范围时,它可能会发现多了一些新插入的数据。这就是幻读。

3.3 不可重复读

不可重复读是指在一个事务内,多次读取同一数据返回的结果不一致。这通常发生在一个事务内先进行了一次查询操作,然后又对该数据进行了更新操作,而另一个事务在此期间也对该数据进行了更新操作。当第一个事务再次读取该数据时,它读取到的是更新后的值,而不是初始值。这就是不可重复读

4. 共享锁和排他锁

  • 共享锁(S 锁):又称读锁,事务在读取记录的时候获取共享锁,允许多个事务同时获取(锁兼容)。
  • 排他锁(X 锁):又称写锁/独占锁,事务在修改记录的时候获取排他锁,不允许多个事务同时获取。如果一个记录已经被加了排他锁,那其他事务不能再对这条事务加任何类型的锁(锁不兼容)。
    排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。

5. 执行一条sql语句的全过程

5.1 查询语句执行流程

1.建立数据库连接
2.校验权限(没有权限直接返回错误信息)
3.MySQL8.0版本前会先查询缓存,以当前sql语句为key查询缓存,如果命中则直接返回结果,否则进入下一步
4.分析器进行语法分析和词法分析
5.优化器选择合适索引,确定执行方案
6.执行器从存储引擎读取记录返回给客户端
MySQL8.0删除了查询缓存,因为缓存命中率低

5.2 更新语句执行流程

1.建立连接
2.更新语句会把这张表上的所有缓存结果清空
3.分析器进行词法分析和语法分析
4.优化器选择合适索引
5.执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接在主键索引树搜索找到这一行。如果ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
6.执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
7.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
8.执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
9.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

6. MySQL索引

索引==>目录

标签:执行器,事务,读取,幻读,基础,脏读,MySQL,数据
From: https://www.cnblogs.com/always-uie/p/18329657

相关文章

  • Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发
    前言  OpenCASCADE是由OpenCascadeSAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。  本篇描述搭建Qt开发occ环境过程。 Demo  ......
  • chsap连接Mysql
    前置操作打开MySql服务 添加引用MySql.Data.dll 数据库查询数据读取一条数据,直接运行就能看到打印台输出。1usingMysql.Data.MyAqlClient;2staticvoidMain(string[]args)3{4stringconnStr="Database=test007;DataSource=127.0.0.1;port=3306;User......
  • 2024年中国AI基础数据服务研究报告(附下载)
    点击访问我的技术博客https://ai.weoknow.comhttps://ai.weoknow.com......
  • Java-API基础 02
    1.正则表达式:用于描述字符串的内容格式,使用它通常用于匹配一个字符串是否符合格式要求正则表达式的语法:1.[]:表示一个字符,该字符可以是[]中指定的内容例如:[abc]:这个字符可以是a或b或c[a-z]:表示任意一个小写字母[a-zA-Z]:表示任意一个字母[a-zA-Z0-......
  • Java-API基础 03
    1.什么是集合:集合和数组一样,可以保存一组数据,并且提供了操作数组元素的相关方法,使用用更加方便2.集合框架中的相关接口:java.util.Collection接口:是所有集合的顶级接口,封装了所有集合所共有的方法,下面有很多实现类,因此我们可以有更多的数据结构来选择。Collection接口下......
  • [Java]基础语法
    注释注释就是程序中对代码进行解释说明的文字生效范围:注释不影响程序执行,因为运行的字节码文件中不保留注释字面量数据在程序中的书写格式称为字面量变量在内存中开辟一块区域,用来存储数据,这块空间称为变量定义变量使用变量变量的优势便于数据的扩展和......
  • 如何在Anaconda基础环境中更新Python?
    如何在Anaconda基础环境中更新Python?Python是否打算在基础环境中进行升级,还是应该完全删除并重新安装Anaconda?任何版本最终都会失去支持,所以应该有一些解决方案。到目前为止我已经尝试过,并没有导致Python更新:condaupdate--allcondaupdate......
  • java基础 手写回忆篇
     java特性:分布行,跨平台性,安全行,多线程,面向对象编程,简单性高级语言分为编译型和解释型:编译型:整个程序写完一起编译速度快效率高解释性:需要一句解释一句编译速度慢效率低java是两者综合:编译器(javac)先把你写好的代码编译成class文件(字节码文件)再用jvm,java虚拟机(解释器)解释执......
  • Java的基础语法
    Java的基础语法首字母缩写1. 简写含义psvm:publicstaticvoidmain(String[]args){sout:System.out.println("Hello,World!");2.更换注释颜色和字体可分别为多行、文档、单行进行注释,在页面右侧选择bold、italic,点击颜色方框选择自己喜欢的颜色。单行注释//单行......
  • Web API 基础案例笔记
    年会抽奖案例图解代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content=......