MySql学习笔记
mysql数据库
数据库概念
数据库就是以一定格式进行组织的数据的集合。通俗来看数据库就是用户计算机上 一些具有特殊格式的数据文件的集合。
数据库有以下特点:
- 持久化存储
- 读写速度极高
- 保证数据的有效性
- 对程序支持性非常好,容易扩展
数据库管理系统
数据库管理系统(英语:Database Management System,简称DBMS)是为管理数据库而设计的软件系统,包括三大部分构成:
- 数据库文件集合. 主要是一系列的数据文件, 作用是存储数据.
- 数据库服务端. 主要负责对数据文件以及文件中的数据进行管理.
- 数据库客户端. 主要负责和服务端通信, 向服务端传输数据或者从服务端获取数据.
他们之间的关系:
- 数据库客户端通过 SQL 语句告诉服务端, 客户端想要做什么.
- 服务端和数据文件一般都在同一台机器上, 直接可以读写数据文件
数据库分类:
- 关系型数据库
- 非关系型数据库
关系型数据库管理系统-RDBMS
所谓关系型数据库RDBS,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据,本质上使用一张二维表来表示关系
关系数据库的主要产品:
-
oracle 银行,电信等项目
-
ms sql server:在微软的项目中使用
-
sqlite:轻量级数据库,主要应用在移动平台
-
mysql:web时代使用最广泛的关系型数据库。
采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体使用成本低,尤其是开源,一般中小型网站的开发都选择MySQL作为网站数据库。
关系型数据库中核心元素
- 数据行(记录)
- 数据列(字段)
- 数据表(数据行的集合)
- 数据库(数据表的集合)
SQL:
SQL语句的作用是实现数据库、客户端和服务端之间的通信,其表现的形式为:带有一定格式的字符串
SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言。当前几乎所有关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 oracle,sql server,mysql,sqlite 等等所有的关系型的数据库。
SQL语句主要分为:(不区分大小写)
- DQL:数据查询语言,用于对数据进行查询,如select
- DML:数据操作语言,对数据进行增加、修改、删除,如insert、update、delete
- TPL:事务处理语言,对事务进行处理,包括begin transaction、commit、rollback
- DCL:数据控制语言,进行授权与权限回收,如grant、revoke
- DDL:数据定义语言,进行数据库、表的管理等,如create、drop
安装:
服务端
# 安装
sudo apt install mysql-server
# 启动服务
sudo service mysql start
# 查看进行是否存在
ps aux | grep mysql
# 停止服务
sudo service mysql restart
mysql 的配置文件
- 配置文件目录为/etc/mysql/mysql.cnf

- 进入conf.d目录,打开mysql.cnf,发现并没有配置
- 进入mysql.conf.d目录,打开mysql.cnf,可以看到配置项

- 主要配置项如下
bind-address表示服务器绑定的ip,默认为127.0.0.1
port表示端口,默认为3306
datadir表示数据库目录,默认为/var/lib/mysql
general_log_file表示普通日志,默认为/var/log/mysql/mysql.log
log_error表示错误日志,默认为/var/log/mysql/error.log
客户端:
# 安装
sudo apt install mysql-cliebt
# 连接命令
mysql -u 用户名 -p 密码
# 退出
quit 或 exit
-
数据库的作用是高效的存储和管理数据
-
数据库一般由三部分组成
-
数据库文件集合:主要是一系列的数据文件,作用是存储数据
-
数据库服务端:主要负责对数据文件以及文件中的数据进行管理
-
数据库客户端:主要负责和服务端通信,向服务端传输数据或者从服务端获取数据
-
-
SQL语句的作用是数据库客户端和服务端之间的通信
数据类型和约束
- 数据类型:存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性
- 数据约束:在数据类型限定的基础上,添加的额外的要求
数据类型:
数据类型影响着数据中存储的数据所占的对数据进行最基本的类型约束、空间大小
- 只有类型符合要求的数据才能存储起来,这救赎对数据完整性的一种要求
- 使用数据类型的原则是:够用就行,尽量使用取值范围小的而不用大的,这样可以更多的节省存储空间
常用数据类型
- 整数:
int,bit - 小数:
decimal - 字符串:
varchar,char - 日期时间:
date,time,datetime - 枚举类型(
enum)
特别说明类型:
decimal表示浮点数,如decimal(5, 2)表示 共存5位数,小数占2位char表示固定长度的字符串,如char(3),如果填充 ‘ab’ 时就会补一个空格 ‘ab ’varchar表示可变长度的字符串,如varchar(3),填充 ‘ab’ 时就会存储 ‘ab’- 对于图片、音频、视屏等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
- 字符串
text表示存储大文件,当字符大于4000时推荐使用
数据约束:
约束本质上是对数据在数据类型限定的基础上添加的额外的要求
常见的数据约束如下:
- 主键
primary key:物理上存储的顺序,mysql建议所有表的主键字段都叫id,类型为int unsigned - 非空
not null:此字段不允许填写空值 - 唯一
unique:此字段的值不允许重复 - 默认
default:当不填写字段对应的值会使用默认值,如果填写时以填写为准 - 外键
foreign key:对关系字段进行约束,当为关系字段填写值时,会到关联的表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并抛出异常,虽然外键约束可以保证数据的有效性,在进行数据的crud,会降低数据库的性能
数据类型附录表
1. 整数类型
| 类型 | 字节大小 | 有符号范围(Signed) | 无符号范围(Unsigned) |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT/INTEGER | 4 | -2147483648 ~2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
2. 字符串
| 类型 | 字节大小 | 示例 |
|---|---|---|
| CHAR | 0-255 | 类型:char(3) 输入 'ab', 实际存储为'ab ', 输入'abcd' 实际存储为 'abc' |
| VARCHAR | 0-255 | 类型:varchar(3) 输 'ab',实际存储为'ab', 输入'abcd',实际存储为'abc' |
| TEXT | 0-65535 | 大文本 |
3. 日期时间类型
| 类型 | 字节大小 | 示例 |
|---|---|---|
| DATE | 4 | '2020-01-01' |
| TIME | 3 | '12:29:59' |
| DATETIME | 8 | '2020-01-01 12:29:59' |
| YEAR | 1 | '2017' |
| TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC |
数据库操作
# 查看版本
select version();
# 显示当前时间
select now();
# 查看所有数据库
show databases;
# 查看当前使用的数据库
select database();
# 使用数据库
use 数据库名;
# 创建数据库
create database 数据库名 charset=utf8;
# 删除数据库
drop database 数据库名;
# 查看当前数据库中的所有表
show tables;
# 查看表结构
desc 表名;
# 创建表结构的语法(auto_increment表示自动增长)
create table table_name(
字段名称 数据类型 可选约束条件,
column1 datatype contrai,
column2 datatype,
...
-- 主键说明可以放在字段中单独说明 也可以放在最后统一说明
PRIMARY KEY(one or more columns)
);
# 修改表
# 添加字段
alter table 表名 add 列名 类型;
# 修改字段-重命名版
alter table 表名 change 原名 新名 类型及约束;
# 修改字段-不重命名版
alter table 表名 modify 列名 类型及约束;
# 删除字段
alter table 表名 drop 列名;
# 删除表
drop table 表名;
# 查看表的创建语句-详细过程
show create table 表名;
增删改查
查:
# 查询所有列
select * from 表名;
# 查询指定列
select 列1,列2,... from 表名;
增:
INSERT [INTO] 表名 [(字段名1,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...;
-
说明:主键列自动增长,但是在全列插入时需要占位,通常使用空值(0或者null);字段默认值 default 来占位,插入成功后以实际数据为准
-
全列插入:值的顺序与表结构字段的顺序完全一一对应,此时字段名列表不用填写
insert into 表名 values(...); -
部分插入:值的顺序与给出的列顺序对应,此时需要根据实际的数据的特点填写对应字段列表
insert into 表名(列1,...) values(值1,...); -
上面的语句一次可以向表中插入一行数据,还可以一次性插入多行数据,这样可以减少与数据库的通信
-
全列多行插入
insert into 表名 values(...),(...),...; -
部分列多行插入
insert into 表名(列1,...) value(值1),(值2),...
改:
UPDATE 表名 SET 字段1名={expr1|DEFAULT} [,col2={expr2|default}] [where 条件判断]
update 表名 set 列1=值1,列2=值2,... where 条件
删:
DELETE FROM 表名 [where 条件判断]
- 物理删除:一旦删除就不容易恢复
delete from 表名 where 条件
- 逻辑删除:其实删除文件进入回收站的本质只是在操作系统的帮助下对文件加上了某个标记,资源管理器中对含有这种标记的文件不会显示。当从回收站恢复的时候只是移除了加上的标记而已。本质就是修改操作
update 表名 set isedelete=1 where id=要删除的id
高级查询
as关键字:
咋使用SQL语句显示结果的时候,往往在屏幕显示的字段名并不具备良好的可读性,此时可以使用as给字段起一个别名
select 字段 as 别名, 字段 as 别名,... from 表名;
消除重复行
distinct可以消除重复的行
select distinct 列1,... from 表名;
where条件
where语句的作用:使用where子句对表中的数据筛选,结果为True的行会出现在结果中
select * from 表名 where 条件;
where后面支持多种运算符,进行条件的处理
- 比较运算符
- 等于:
= - 大于:
> - 大于等于:
>= - 小于:
< - 小于等于:
<= - 不等于:
!= 或 <>
- 等于:
- 逻辑运算符
andornot
- 迷糊查询
like%:表示任意多个任意字符_:表示一个任意字符
- 范围查询
in:表示在一个非连续的范围内between ... and ...:表示在一个连续的范围内
- 空判断
排序:
语法:selcet * from 表名 order by 列1 asc|desc,列2 asc|desc,...
- 将行数据按照列1进行排序,如果某些行 列1 的数据相等,按照 列2 排序,以此类推
asc: 从小到大排序,即升序desc: 从大到小排序,即降序- 默认按照列值从小到大排列(即
asc关键字)
分页:
语法:select * from 表名 limit start=0,count
- 从
start开始,获取count条数据 start默认值为0- 当用户需要获取数据的前
n条的时候可以直接写上xxx limit n;
聚合函数:
聚合函数aggregation function又称为组函数,默认情况下,聚合函数会对当前所在表当做一个组进行统计
聚合函数有以下特点:
-
每个组函数接收一个参数(字段名或者表达式)
-
统计结果中默认忽略字段为
NULL的记录,想要列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换不允许出现嵌套 如:
sum(max(xx))
总数:
count(*):表示计算总行数,括号中写 *与列名,结果是相同的
select count(*) from 表名;
最大值:
max(列):表示求此列的最大值
select max(列名) from 表名 where 条件;
最小值:
min(列):表示求此列的最小值
select min(列名) from 表名 where 条件;
求和:
sum(列):表示求此列的和
select sum(列名) from 表名 where 条件;
# 平均值
select sum(列名)/count(*) from 表名 where 条件;
平均值:
avg(列):表示求此列的平均值
select avg(列名) from 表名 where 条件;
分组
group by分组:
group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组group by可用于单个字段分组,也可用于多个字段分组
在mysql默认的情况下,select后的字段只能出现以下两种情况:
- 在
group by后出现过 - 在聚合函数中出现
group by + group_concat():
group_concat(字段名)根据分组结果,使用group_concat()来放置每一个分组中某字段的集合
group by + 聚合函数:
聚合函数在和group by结合使用的时候 统计的对象是每一个分组。
group by + having:
having 条件表达式:用来过滤分组结果
having作用和where类似,但having只能用于group by 而where是用来过滤表数据
group by + with rollup:
- with rollup的作用是:在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果。
连接
mysql支持三种类型的连接查询:
- 内连接查询:查询的结果为两个表匹配到的数据
- 右(外)连接查询:查询的结果为两个表匹配到的数据和右表特有的数据,对于左表中不存在的数据使用
null填充 - 左(外)连接查询:查询的结果为两个表匹配到的数据和左表特有的数据,对于有表中不存在的数据使用
null填充
连接查询语法:
# 对于外连接 outer关键字可以省略
select * from 表1 inner或left或right 表2 on 表1.列 运算符 表2.列
自连接:
当需要将多张表的相关数据汇总一个结果集中,并且多张表的数据来源自同一张表。自连接就是一种特殊的连接方式。
需要对表起多个不同的别名才能进行自连接查询
子查询:
在一个select语句中,嵌入了另一个select语句,那么被嵌入的select语句称之为子查询语句,外部那个select语句则称为主查询
主 查询和子查询的关系:
- 子查询是嵌入到主查询中
- 子查询是辅助主查询的,要么充当条件,要么充当数据源
- 子查询是可以独立存在的语句,是一条完整的
select语句
子查询分类:
- 标量子查询:子查询返回的结果是一个数据(一列一行)
- 列子查询:返回的结果是一列(一列多行)
主查询 where 条件 in (列子查询)
- 行子查询:返回的结果是一行(一行多列)
主查询 where (字段1, 字段2, ...) = (行子查询)
外键:
foreign key约束指定某一个列或一组列作为外部键,其中包含外部键的表称为子表,包含外键所引用的键的表称为父表。
-
在goods表中拥有cate_id和brand_id分别都来自于goods_cates表和goods_brands表
-
cate_id字段的值引用自goods_cates的id字段,即cate_id就是"外键"。
-
一旦成为真正的外键,那么外键将会对用户修改cate_id产生约束: cate_id 取值范围就是 goods_cates中id字段的取值范围,否则将报错
-
brand_id同理
-
如何防止无效信息的插入,就是可以在插入前判断类型或者品牌名称是否存在呢? 可以使用之前讲过的外键来解决
-
外键约束:对外键字段的值 在更新和插入时进行和引用的表中字段数据进行对比
-
关键字: foreign key,只有 innodb数据库引擎 支持外键约束
删除外键约束:
# 需要先回外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
show create table 表名;
# 获取名称之后就可以根据名称来删除外键约束
alter table 表名 drop foregin key 外键名称;
将查询数据直接插入表中
insert into 字段名 select 语句
连表更新
update 表1 join 表2 on 连接条件
set 某表.字段=值
外键约束作用:子表中的外键字段在插入和更新新值的时候,新值必须在主表中相应字段出现过
三范式
- 经过和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为三范式
- 目前有迹可循的共有8种范式,一般需要遵守三范式即可
- 第一范式:强调的是列的原子性,即列不能够在分成其他几列
- 第二范式:首先是1NF,另外包含两部分内容,意识表必须有一个主键;二是非主键字段必须完全依赖于主键,而不能只依赖于主键的一部分
- 第三范式:首先是2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖,即不能存在:非主键列A依赖于非主键列B,非主键列B依赖于主键的情况
数据库编程
通过使用程序代码的方式去连接数据库服务器,通过和服务器进行交互完成对数据看的增删改查的方式,就称为数据库编程
pymysql的使用
# 引入模块
from pymysql import connect
Connection对象
用于建立与数据库的连接,调用pymysql模块中的connect()方法
conn=connect(参数列表)- 参数
host:连接的mysql主机,如果本机是localhost - 参数
port:连接的mysql主机的端口,默认是3306 - 参数
database:数据库的名称 - 参数
user:连接的用户名 - 参数
password:连接的密码 - 参数
charset:通信采用的编码方式,推荐使用utf8
- 参数
- 关闭连接:
conn.close() - 提交数据:
conn.commit() - 撤销数据:
conn.rollback() - 通过连接获取游标
cur = conn.cursor()返回Cursor对象,用于执行SQL语句并获取结果
Cursor游标对象
-
获取Cursor对象:目的,执行SQL语句(使用频度最高的语句为select、insert、update、delete)
# 调用Connection对象的cursor()方法 cur = conn.cursor() -
使用游标执行SQL语句
execute(operation [,parameters]) # 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句 -
关闭游标
cur.close() -
获取结果中的一条
cur.fetchone() # 返回一个元祖,形如 (1,'妲己',18) -
获取结果集中的所有
cur.fetchall()执行查询时,获取结果集的所有行,一行构成一个元祖,在将这些元祖装入一个元祖返回,如((元祖1),(元祖2),...)
pymysql中数据需要手动提交commit才能保存到数据库中
参数化防注入
产生原因:后台将用户提交的带有恶意的数据和SQL进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。
防止:SQL语句参数化,将SQL语句所有数据参数存在一个列表中传递给execute函数的第二个参数
注意:此处的不同于python的字符串格式化,必须全部使用%s占位,所有参数所需的占位符外不需要加引号
视图
视图就是一个能够把复杂的SQL语句的功能封装起来的一个虚表,所以在创建视图的时候,主要的额工作就落在创建这条SQL查询语句上
视图是对若干张基本表的引用,一张虚表,只查询语句的执行结果的字段类型和约束。不存储具体的数据(基表数据发生变化,视图也会跟着变化)
视图封装来了对多张基本标的复杂操作,简化用户操作
视图只是一个虚表,并不存储任何基本表的表数据,当用户使用视图的时候,视图会从基本表中取出
通过视图可以对用户展示指定字段从而屏蔽其他字段数据,更加安全
作用:方便操作,特比是查询操作,减少复杂的SQL语句,增强可读性
定义视图:建议以v_开头
create view 视图名称 as select语句;
# 视图在保存基本表字段信息的时候字段不能重复,要对select结果集中的字段进行重命名
使用视图
# 查看表会将所有视图也列出来
show tables;
# 视图的用途就是查询
select * from 视图名称;
删除视图
drop view 视图名称;
事务
事务,是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全的执行,要么完全的都不执行
事务四大特性ACID
- 原子性(Atomicity)
- 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的左右操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
- 一致性(Consistency)
- 数据库总是从一个一致性的状态转换到另一个一致性的状态
- 隔离性(Isolation)
- 通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的
- 持久性(Durability)
- 一旦事务提交,则其所做的修改会永远保存到数据库(此时即使系统崩溃,修改的数据也不会丢失)
- 原子的ACID特性
- 事务有原子性、一致性、隔离性、持久性
- 原子性强调事务中的多个操作时一个整体
- 一致性强调数据库中不会保存不一致状态
- 隔离性强调数据库中事务之间相互不可见
- 持久性强调数据库能永久保存数据,一旦提交就不可撤销
使用
表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
过程
# 开启事务
begin; 或 start transaction;
# 提交事务 将缓存中的数据变更维护到物理表中
commit;
# 回滚事务 放弃缓存中变更的数据,表示事务执行失败,应该回到开始事务前的状态
rollback;
事务方面需要注意的几个问题:
- 修改数据的命令会自动地触发事务,包括insert、update、delete
- 在mysql命令行中会自动提交事务,所以当insert语句执行完成后没有commit数据库也可以看到提交的数据
- 当不需要mysql命令自动提交的时候,键入
set autocommit=0即可 - SQL语句中手动开启事务的原因是:可以进行多次数据的修改,如果成功一起成功,否则一起回滚到之前的数据
- 不可撤销的操作(隐式提交):除了对表数据insert/update/delete语句之外的绝大多数语句都是不能撤销的,比如数据库、表结构的操作
索引
索引是一种特殊的文件(InnoDB数据上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息,更通俗的说,数据库索引好比是一本书前面的目录,能够加快数据库的查询速度
使用
# 查看表中已有的索引
show index from 表名;
# 创建索引
# 如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
# 字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度));
# 删除索引
drop index 索引名称 on 表名;
-
索引可以明显提高某些字段的查询效率
-
索引的副作用:
- 要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引
- 建立索引会占用磁盘空间
账户管理
mysql的账户体系:根据账户所具有地权限不同,mysql的账户可以分为以下几种:
- 服务实例级账号:启动一个mysql,即为一个数据库实例
- 数据库级别账号:对特定的数据库执行增删改查的所有操作
- 数据表级别的账号:对特定表执行增删改查等所有操作
- 字段级别的账号:对某些特定字段进行操作
- 存储程序级别的账号:对存储程序进行增删改查的操作
注意:进行账户操作时,需要使用root账户登录,这个账户拥有最高的实例级权限。账户的操作主要包括创建账户、删除账户、修改密码、授权权限等。
授予权限
需要使用实例级别的账户登录后操作,以root为例
主要操作包括:
- 查看所有用户
- 修改密码
- 删除用户
查看所用用户:
-
所有用户及权限信息存储在mysql数据库的user表中
-
查看user表的结构
desc user; -
主要字段说明
Host:表示允许访问的主机User:表示用户名authentication_string:表示密码,为加密后的值
查看所有用户:
select host,user,authentication_string from user;
创建账户、授权
- 需要使用实例级账户登录后操作,以root为例
- 常用权限主要包括:
create、alter、drop、insert、update、delete、select - 如果分配所有权限,可以使用
all privileges
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
示例:
grant select on jing_dong.* to 'laowang'@'localhost' identified by '123456';
说明
- 可以操作python数据库的所有表,方式为:
jing_dong.* - 访问主机 通常使用 百分号
%表示此账户可以使用任何ip的主机登录访问此数据库 - 访问主机可以设置成
localhost或具体的ip,表示只允许本机或特定主机访问
查看用户有哪些权限
show grants for 用户名@访问主机;
退出root的登录
quit
修改权限
grant 权限名称 on 数据库 to 账户@主机 with grant option;
修改密码
使用root登录,修改mysql数据库中的user表
-
使用
password()函数进行密码加密update user set authentication_string=password('新密码') where user='用户名'; -
注意修改完需要刷新权限
flush privileges
远程登录:
修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
在配置文件的bind-addr=127.0.0.1前用#注释,然后重启msyql
service mysql restart
删除账户
-
语法1:使用root登录
drop user '用户名'@'主机'; -
语法2:使用root登录,删除mysql数据库的user表中的数据
delete from user where user='用户名'; -- 操作结束之后需要刷新权限 flush privileges
MySQL的事务隔离级别
事务隔离级别是指在处理同一个数据的多个事务中,一个事务修改数据后,其他事务何时才能看到修改后的结果
mysql数据库事务隔离就别主要有四种:
Serializable串行化,一个事务一个事务的执行Repeatable read可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响Read committed读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值Read uncommitted读取未提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值
mysql数据库默认使用可重复读(Repeatable read)
修改方法:
cd /etc/mysql/mysql.conf.d
sudo vim mysqld.cnf
# 添加
transaction-isolation=READ-COMMITTED

浙公网安备 33010602011771号