From 2772100ba040cbd2f22d82837618b8cd03ca6d53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90?= <11785189+beckoningchen@user.noreply.gitee.com> Date: Wed, 25 Oct 2023 02:09:50 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=2014=20?= =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90/=E5=BE=AE=E4=BF=A1=E5=9B=BE?= =?UTF-8?q?=E7=89=87=5F20231018230147.png=20=E4=B8=BA=2014=20=E9=99=88?= =?UTF-8?q?=E6=96=B0=E6=88=90/20231018=20=E4=B8=80=E5=8D=83=E4=B8=87?= =?UTF-8?q?=E6=9D=A1=E6=95=B0=E6=8D=AE.png?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...270\207\346\235\241\346\225\260\346\215\256.png" | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename "14 \351\231\210\346\226\260\346\210\220/\345\276\256\344\277\241\345\233\276\347\211\207_20231018230147.png" => "14 \351\231\210\346\226\260\346\210\220/20231018 \344\270\200\345\215\203\344\270\207\346\235\241\346\225\260\346\215\256.png" (100%) diff --git "a/14 \351\231\210\346\226\260\346\210\220/\345\276\256\344\277\241\345\233\276\347\211\207_20231018230147.png" "b/14 \351\231\210\346\226\260\346\210\220/20231018 \344\270\200\345\215\203\344\270\207\346\235\241\346\225\260\346\215\256.png" similarity index 100% rename from "14 \351\231\210\346\226\260\346\210\220/\345\276\256\344\277\241\345\233\276\347\211\207_20231018230147.png" rename to "14 \351\231\210\346\226\260\346\210\220/20231018 \344\270\200\345\215\203\344\270\207\346\235\241\346\225\260\346\215\256.png" -- Gitee From 9841a6fd64618446f8e251e6735885a39916e5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90?= <11785189+beckoningchen@user.noreply.gitee.com> Date: Wed, 25 Oct 2023 02:13:33 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=2014=20?= =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90/20231019.md=20=E4=B8=BA=2014=20?= =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90/20231019=20=20=E4=BA=8B=E5=8A=A1.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20231019 \344\272\213\345\212\241.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "14 \351\231\210\346\226\260\346\210\220/20231019.md" => "14 \351\231\210\346\226\260\346\210\220/20231019 \344\272\213\345\212\241.md" (100%) diff --git "a/14 \351\231\210\346\226\260\346\210\220/20231019.md" "b/14 \351\231\210\346\226\260\346\210\220/20231019 \344\272\213\345\212\241.md" similarity index 100% rename from "14 \351\231\210\346\226\260\346\210\220/20231019.md" rename to "14 \351\231\210\346\226\260\346\210\220/20231019 \344\272\213\345\212\241.md" -- Gitee From d67f264c23dadae8027021a5e1255101f1a024dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90?= <11785189+beckoningchen@user.noreply.gitee.com> Date: Wed, 25 Oct 2023 02:15:56 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈新成 <11785189+beckoningchen@user.noreply.gitee.com> --- .../20231017 \347\264\242\345\274\225.md" | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 "14 \351\231\210\346\226\260\346\210\220/20231017 \347\264\242\345\274\225.md" diff --git "a/14 \351\231\210\346\226\260\346\210\220/20231017 \347\264\242\345\274\225.md" "b/14 \351\231\210\346\226\260\346\210\220/20231017 \347\264\242\345\274\225.md" new file mode 100644 index 0000000..9f5f492 --- /dev/null +++ "b/14 \351\231\210\346\226\260\346\210\220/20231017 \347\264\242\345\274\225.md" @@ -0,0 +1,130 @@ +# 笔记 + +### 索引:是帮助mysql高效获取数据的数据结构 + +### 创建索引 + +```sql +create index 索引名 on 表格(列名); +``` + +```sql +alter table 表名 add index 索引名(列名); +``` + +```sql +create table 表名( +..... +index 索引名(列名) +); +-- 以这种方式定义的索引,可以不指定索引名称 +``` + +### 删除索引 + +```sql +drop index 索引名 on 表名; +``` + +```sql +alter table 表名 drop index 索引名; +``` + + + +### 查看表的索引 + +```sql +show index from 表名; +``` + + + +### 唯一索引 + +索引烈儿的值必须唯一,但允许有空值,如果是组合索引则列值的组合必须唯一。 + +创建语法: + +```sql +create unique index 索引名 on 表名(列名); +``` + +```sql +alter table 表名 add unique 索引名(列名); +``` + +```sql +create table 表名( +....... + unique[index] 索引名(列名) +); +``` + +(1)唯一索引必须有索引名,有唯一约束就会自动有唯一索引 + +(2)约束是没有名称和index关键字的 + +(3)删除唯一索引与删除普通索引相同 + +### 主键索引 + +(1)有主键约束就会有主键索引 + +(2)create index不能用来创建主键索引 + +(3)创建语法: + +```sql +create table 表名( +列表名 数值类型 primary key, + ...... +); +``` + +```sql +create table 表名( +........ + primary key (列名) +); +``` + +```sql +alter table 表名 add primary key (列名); +``` + +(4)删除主键索引 + +删除主键不用drop index + +```sql +alter table 表名 drop primary key; +``` + + + +### 联合索引 (遵循最左前缀法则) + +(1)普通联合索引 + +```sql +create index 索引名 on 表名 (列名1,列名2,列名3....); +``` + +(2)联合唯一索引 + +```sql +create unique index 索引名 on 表名 (列名1,列名2,列名3....); +``` + + + +### explain 联合计划 + +用来查看某个查询语句的执行详细情况 + +语法: + +```sql +explain select.......from......; +``` \ No newline at end of file -- Gitee From 62c11350e54094a1f774a1e596ca98bc271da6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=96=B0=E6=88=90?= <11785189+beckoningchen@user.noreply.gitee.com> Date: Wed, 25 Oct 2023 10:41:55 +0000 Subject: [PATCH 4/4] 14 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 陈新成 <11785189+beckoningchen@user.noreply.gitee.com> --- .../20231024 \346\200\273\347\273\223.md" | 566 ++++++++++++++++++ 1 file changed, 566 insertions(+) create mode 100644 "14 \351\231\210\346\226\260\346\210\220/20231024 \346\200\273\347\273\223.md" diff --git "a/14 \351\231\210\346\226\260\346\210\220/20231024 \346\200\273\347\273\223.md" "b/14 \351\231\210\346\226\260\346\210\220/20231024 \346\200\273\347\273\223.md" new file mode 100644 index 0000000..1fb9060 --- /dev/null +++ "b/14 \351\231\210\346\226\260\346\210\220/20231024 \346\200\273\347\273\223.md" @@ -0,0 +1,566 @@ +使用工具 VISIO + +ER 图 : 实体关系属性图 + +在多表多属性的数据库中,表中的元素关系类别: + +一对一 :1:1 相互独立且唯一,联表时可以任意一个表的主键联系到另一个表做外键。 + +一队多:1:N 联表时可以以“一”的表中的主键联系到另一个表做外键。 + +多对多:M:n 建立第三张中间表 ,中间表来联系两个表的, 中间表至少包含两个外键,两个外键是其他两个表的主键。 + +## 数据库设计的三大范式: + +范式一:每个属性字段要求不可分割,也就要求有原子性。 + +范式二:满足第一范式的基础上 要求非主键字段要完全依赖主键(有联合主时,非主键要同时完全依赖这两个主键),而且不能部分依赖。 + +范式三:在满足第二范式的基础上,要求非主键字段要直接依赖主键。 + +概念模型:CDM () ER图 + +逻辑模型:LDM () 电脑表示的视图 + +物理模型: PDM () 生成数据库 + +## R.B.A.C 模型 + +RBAC:Role Based Access Control 基于角色的访问控制。 + +基于角色的访问权限管制模型,一种数据库设计思想。 + +RBAC重要对象: + +1. 用户(Employee):角色施加的主体;用户通过拥有某个或多个角色以得到对应的权限。 +2. 角色(Role):表示一组权限的集合。 +3. 权限(Permission):一个资源代表一个权限,是否能访问该资源,就是看是否有该权限。 +4. RBAC:核心是角色(基调) 在数据库设计时一定要有角色。 + +# 视图 + +视图:一个或多个的虚拟表,并不储存数据。 关键字:view + +提供数据内容的语句为select语句(储存的select语句) + +### 作用 + +使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件 + +增加数据的安全性,通过视图,用户只能查询和修改指定的数据 + +提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。 + +创建视图: + +``` +create view 视图名称 as select * from 表名 +``` + +指定视图: + +``` +create view () as select * from 表名 +``` + +修改视图: + +``` +create or replace view 视图名称 as select from 表名 + + +alter view 视图名称 as select * from 表名 +``` + +## 截取: + +``` +select substring (); +select substr () +select mid () +``` + +## 去空格:关键字:trim + +ltrim 去左边 + +rtrim 去右边 + +## 函数: + +随机数: rand() [0,1] 小数 + +向下取整 : floor (rand()) + +向上取整: ceil(rand() ) + +合并字符串:select concat() + +字符串长度: length() turncate 1、截取 2、保留几位小数。 + +替换字符串 : replace : select replace (@a ,'软件','信息')。 + +填充补位: select ipat(8,8,0) 0.0000008。 + +# 存储过程: + +### 存储 关键字: proceodure + +临时将MySQL 语句的结束标志 空界符 + +``` +delimiter// +-- 创建存储过程 +create procedure pro_tb1() +begin +select * from t11; +.... +select * from t12; +end // +delimiter ; + + +-- 调用 +call pro_tb1; +``` + +## CRVD + +CRVD 表示程序中的增利小改查不同编程语法有不同语法. C : Create 、 insert . v : upod updote .. alter . R : read . show . select . D . drop . ddete 每个. SQL 语句后面的;不能省. + +MySQL 中的变量分为三种类型:系统变量、自主义变量、局部变量 查看系统变量: Show [SeSSion / GLOBAL ] VARIABLES . 查看所有系统实量 Show [Session / GLOBAL ] VARIABLES . 可以通过 like .模糊匹配方式查找变量 select @@ [session / GLOBAL] .系统其量名.…查看指定变量的值 + +参数的类型,主要分为以下三种: IN . OUT . INouT .具体含义如下 + +IN 注类参数作为输入.也就是需要;凋用时传入值默认 + +OUT .注类参数作为输出.也就是该参数.可以近回值. InouT .既可以作为输入输参数,也就可以为输出参数 + +CREATE PROCEDURE 存储过程名称( IN /OUT / INOUT.参数名.参数类型) + +BegIN . SQL 语句. END ; + +全局变量 (GLOBAL ):全局实量针对于所有会话。 会话变量 (SESSION ):会为变量针对于单人会话,在另一个.会话窗口.就不生效了. + +局部变量 DECLARE .变量名.变量类型[DEPAULT…] 赋值 SeT 实量名=值: SeT 变量名=值. + +存储过程,是否支持条行.判断的分支结构 语法if.条件. then SQL 语句 if .条件1. Then 可选. Elself .条件2、 Then 可选 else 可 ENd if. 语句后要跟 end if 为结束语. 在if条中判断的结构中.elseif.结构可以有多个,也可以没有. Else 结构可以有,也以没有 Case . Cade 结构及作用. case _ valve 的值为 when value1 时执行. startment ._ list 1.当盾为 when _value2执行. Statement - list 2.否则执行. statement _ list 1. Case : Case valve . when . wher ralve I Then . stactement -list1. when when __valwo2 Then statement -list2. ELSE . Statemet _ list END . CASE + +## 循环 + +``` +Loop: + +loop 不需要条件的死循环(里面有条件终止循环的条件) + +while 有条件的循环,必须满足条件才会进入循环里面要有改变条件的变量的语句 + +repeat 至少执行一次的循环,在判断循环的条件的变量的语句 + +iterate :用于循环中 作用跳过当前的循环语句,并且直接进入下一个循环 + + [ loop_tabel : ] loop + 循环执行语句 + END loop [loop_table] + loop 循环中有leave子句 + +leave 相当于 jave中的break 中止循环或中止储存的过程的执行,即可用在 loop 、while、repeat 循环中,也可以直接用于begin ,,, end之间 + +无论在哪里 都要跟上标识符 leave a + +while : + +while 循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为: 先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑 + + while 条件 do + sql逻辑 + end while + +repeat: + +repeat是有条件的循环控制语句, 当满足until声明的条件的时候,则退出循环 。具体语法为:先执行一次逻辑,然后判定UNTIL条件是否满足,如果满足,则退出。如果不满足,则继续下一次循环 + + repeat + sql 逻辑 + UNtil 条件 + end repeat +``` + +## 储存函数 + +``` +存储函数:关键字 function + + create function func_name([ name type)]) + returns varchar + [characteristic] + begin + routine_body + end; + +(1)name :存储函数的名称。 + +(2)name type:可选项,指定存储函数的参数。type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。 + +(3)RETURNS type:指定返回值的类型。 + +(4)characteristic:可选项,指定存储函数的特性。说明 + +(5)routine_body:SQL代码内容。 + +储存函数的调用:在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法基本相同。用户自定义的存储函数与MySQL内部函数性质相同。区别在于,存储函数是用户自定义的。而内部函数由MySQL自带。其语法结构如下: + +deterministic : 相同的输入参数总是产生相同的结果 + +read sql data : baohan读取数据的语句,但不包含写入数据的语句 + + SELECT func_name([parameter[,…]]); + +修改储存 函数: + +关键字:alter function 语句来修改储存函数 + + alter function name [characteristic] + characteristic : + comment 'string' + language sql + +删除储存函数: + + drop function if exists name; +``` + +## 触发器 + +``` +关键字 tiggeers + +触发器 是与表有关的数据库的对象,指在 insert/update/delete之前 + +before 或者after 之后 触发器并执行触发器中的定义的SQL语句集合。 + +事件A 对user表新增一条数据 姓名name 年龄age 性别sex + +事件B 对userlogs记录一条user表的操作 new.name,new.age + +触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作。 + +使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。**触发器只支持行级触发** + +insert : new代表将要新增或已新增的数据 + +update : old 代表更新前的数据,new代表更新后的数据 + +delete : old代表将要删除或已删除的数据 + +创建触发器: + + create trigger 触发器名称 + before/after(触发时机) insert/update/delete(触发类型) + on 表名 for each row -- 行级触发器 + begin + 触发的语句 + end; + +查看 + + show triggers + +删除 + + drop trigger 触发器名称 +``` + +## 游标 + +``` +## 游标 + +游标概念:游标可以用来依次取出查询结果集中的每一条数据(逐条读取,结果集中的每一条记录)。 + +1、声明邮标:declare 游标名称 cursor for sql查询语句 + + declare score cursor for select score_id; + +2、打开游标: open 游标名称 + + open score + +3:使用游标的语法 + + -- 使用游标结合循环语句一起使用 + -- 使用游标(提取游标当前指向的数据)之后往下移动 + -- FETCH 游标名称 INTO 变量1,变量2...; + FETCH socre INTO id , name ,chji; + + + +4、获取记录 + +fetch 游标名称 into 变量[,变量] + +5、关闭游标 + +close 游标名称 + + close score + +条件处理程序:关键字 handler + +可以用来定义在流程控制结构执行过程中所遇到的问题是相应的处理步骤 + +具体语句: + + declare handler_action handler for condition_value [, condition_value ] + +handler_action :取值 + +continue :继续执行当前的程序 + +exit : 终止执行当前程序 + +condition_value :取值 + +SQLSTATE sqlstate_value: 状态码 02000; + +SQLWARNING:所有01开头的sqlstate 代码简写 + +not found :所有02开头的 sqlstate 代码简写 + +SQLEXCEPTION: 所有没有被SQLWARNING 或 NOT FOUND捕获的SQLSTATE代码的简写 +``` + +## 窗口函数、 + +``` +## 窗口函数 + +非聚合窗口函数:是相对于聚合函数来说的,特性为非聚合。一次只处理一行数据。 + +窗口聚合函数:窗口聚合函数在单元行上计算某个字段的结果时,可将窗口范围内的数据输入到聚合函数中,并且不会改变行数。 + +### 窗口函数的语法结构: + +关键字 : over 指定函数窗口的范围 + +语法 + + 窗口函数名称(参数) over (partition by 。。。 order by ...窗口大小) + +parttiton by 分组 等价于 group by + +order by 排序 + +## 序号函数 + +row_number():它为结果集的分区中的每一行分配一个连续的整数。 行号以每个分区中第一行的行号开头。row_number函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,2,3,4 + +rank():rank函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,1,1,4 + +dense_rank():dense_rank函数:对于4,4,4,8,也就是如果有并列名次的行,排序结果是:1,1,1,2 +``` + +## 索引 + +``` +关键字:index 帮助MySQL 高效获取数据的数据结构 + +## 普通索引: + +直接在原有的表上创建索引: + + create index 索引名 on 表明(列名) + +修改表的结构追加普通索引: + + Alter table 表名 add index 索引名(列表名) + +如何查看已有的索引 + + show index from 表名 + +删除索引: 直接删除 + + drop index 索引名 on 表名 + + alter table 表名 drop index 索引名 + +## 唯一索引: + +关键字:unique + +创建唯一索引: + + create unique index 索引名 on 表名 (列名) + +在已存在的表上追加唯一索引: + + alter table 表名 add unique 索引名(列名) + +删除唯一索引的方法与删除普通索引相同 + +## 主键索引: + +特殊的唯一索引 不允许有空值 ,一般创建表时会 创建索引 + +删除主键索引 不能用 drop index: + + alter table 表名 drop primary key + +## 联合索引: + + create index 索引名 on 表名(列名1,列名2....) -- 普通的联合索引 + create unique index 索引名 on 表名(列名1,列名2....) -- 联合唯一索引 + +*执行原则:最左前缀法则 + +最左前缀法则(联合索引) + +如果使用了联合索引,要遵守最左前缀法则。 + +最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,后面的字段索引失效。 +``` + +## 事务 + +``` +事务 + +一组SQL 语句,要么全部成功,要么全部失败 ,不存在半失败半成功 + +## 事务特性: ACID + +1、原子性:(Atomicity) ,事务的整个过程如[原子操作](https://so.csdn.net/so/search?q=%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C&spm=1001.2101.3001.7020)一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。 + +2、一致性:(Consistency) ,一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。 + +3、 隔离性(Isolation) 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 + +隔离级别: + +读未提交:read uncommitted + +读已提交:read committed + +可重复读:repeatable read + +串行化:serializable + +4、持久性: (Durability):一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。 + +## MYSQL中的事务操作: + +分为隐式操作和显式操作 + +其中MYSQL中事务的默认为隐式事务,执行insert、update、delete 操作的时候,数据库自动开启事务、提交或回滚事务。 + +是否开启隐式事务是由变量autocommit控制的。 + +### 两种开启手动控制事务的操作: + +#### 方法一、 + + -- 设置不自动提交事务 + set autocommit =0; + set autocommit = off; + + // 执行事务操作 + commit(确认) / rollback(回滚) + + -- 开启自动 提交(开启隐式事务) + set autocommit = 1; + set autocommit = on ; + + +#### 方法二、 + + start transaction // 开启事务 + // 执行事务操作 + commit(提交)/ rollback (回滚) + +## 保存点:关键字 savepoint + +我们可以将一大批操作分为几个部分,然后指定回滚某个部分。 + + -- 执行sql删除语句 + delete from emp where id =1 ; + -- 保存点(分段回滚点) + savepoint tb1; + -- 执行回滚到保存点 + rollback to tb1; + +## 只读事务 + +表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作,数据库内部对只读事务可能会有一些性能上的优化。 + + start transaction read only; + + +## 事务中的一些问题(重点) + +**这些问题主要是基于数据在多个事务中的可见性来说的。也是并发事务产生的问题。** + +### 1、 更新丢失 + +丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失。 + +1、第一类丢失更新 :A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改时失败然后回滚,把A更新的数据也回滚了。(事务撤销造成的撤销丢失) + +2、第二类丢失更新:A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改并且提交,把A提交的数据给覆盖了。(事务提交造成的覆盖丢失) + +### 2、 脏读 + +一个事务在执行的过程中读取到了其他事务还没有提交的数据。 这个还是比较好理解的。 + +两个事务同时操作同一数据,A事务对该数据进行了修改还没提交的时候,B事务访问了该条事务,并且使用了该数据,此时A事务回滚,那么B事务读到的就是脏数据。 + +比如事务1,修改了某个数据 事务2,刚好访问了事务1修改后的数据 + +此时事务1,回滚了操作 事务2,读到还是回滚前的数据 + +### 3、 读已提交 + +从字面上我们就可以理解,即一个事务操作过程中可以读取到其他事务已经提交的数据。 + +事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(相当于当前读) + +### 4、不可重复读 + +在同一事务中,多次读取同一数据返回的结果有所不同,换句话说,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读” 在同一事务中多次读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据。 + +这种情况发生 在一个事务内多次读同一数据。A事务查询某条数据,该事务未结束时,B事务也访问同一数据并进行了修改。那么在A事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。 + +事务1,查询某个数据 事务2,修改了某个数据,提交 + +事务1,再次查询这个数据 + +这样事务1两次查询的数据不一样,称为不可重复读 + +### 5、 可重复读 + +一个事务操作中对于一个读取操作不管多少次,读取到的结果都是一样的 + +### 6、幻读 + +## 事务的隔离级别 + +事务隔离级别主要是解决了上面多个事务之间数据可见性及数据正确性的问题。(或者说为了解决并发控制可能产生的异常问题,数据库定义了四种事务的隔离级别) + +隔离级别分为4种: + +读未提交:READ-UNCOMMITTED读已提交:READ-COMMITTED可重复读:REPEATABLE-READ串行:SERIALIZABLE + +查看隔离级别: + + show variables like 'transaction_isolation'; + + +### 各种隔离级别中会出现的问题 + +| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | +| --- | --- | --- | --- | +| READ-UNCOMMITTED | 有 | 有 | 有 | +| READ-COMMITTED | 无 | 有 | 有 | +| REPEATABLE-READ | 无 | 无 | 有 | +| SERIALIZABLE | 无 | 无 | 无 | +``` \ No newline at end of file -- Gitee