mysql数据库的使用(上)

1、什么是数据库

数据库 ( DataBase , 简称DB )

概念:数据库,顾名思义,是存放数据的仓库。严格地讲,数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。
特点:永久存储、有组织、可共享。
数据库类型

  • 关系型数据库( SQL )
    • MySQL , Oracle , SQL Server , SQLite , DB2 , …
    • 关系型数据库通过外键关联来建立表与表之间的关系
  • 非关系型数据库 ( NOSQL )
    • Redis , MongoDB , …
    • 非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

2、什么是数据库管理系统

数据库管理系统 ( DataBase Management System,DBMS )

科学地组织和存储数据、高效地获取和维护数据的系统软件。

我们要学习的MySQL应该算是一个数据库管理系统。

3、连接数据库

  • 在DOS命令行窗口进入 安装目录\mysql\bin
  • 可设置环境变量,设置了环境变量,可以在任意目录打开

连接数据库语句 :

mysql -u用户名 -p用户密码
或者
mysql -u用户名 -p
密码

注意 : -p后面不能加空格,否则会被当做密码的内容,导致登录失败 !

退出mysql:

exit;

4、操作数据库

4.1、结构化查询语句分类


数据定义语言 DDL(Data Definition Language)
数据操作语言 DML(Data Manipulation Language)
数据查询语言 DQL(Data Query Language)
数据控制语言 DCL(Data Control Language)

4.2、数据库操作

创建数据库 : create database [if not exists] 数据库名;
删除数据库 : drop database [if exists] 数据库名;
查看数据库 : show databases;
使用数据库 : use 数据库名;

4.3、创建数据表

属于DDL的一种,语法 :

create table 表名( 
字段名1 列类型 [属性][索引][注释], 
字段名2 列类型 [属性][索引][注释], 
#... 
字段名n 列类型 [属性][索引][注释] 
)[表类型][表字符集][注释];

4.4、数据类型

数值类型

数据类型说明大小
tinyint非常小的数据1字节
smallint较小的数据2字节
mediumint中等大小的数据3字节
int标准整数4字节
bigint较大的整数8字节
float单精度浮点数4字节
double双精度浮点数8字节
decimal(m,d)定点数,由m位数字组成,小数点后面有d位数字m字节

decimal十进制小数,精度高,而且没有误差。和浮点数相差很大。浮点数是直接把小数转化为二进制,小数转化为二进制是有误差的,也就是说不能精确表示。decimal则可以没有任何误差的表示小数。

字符串类型

类型说明最大长度
char(M)固定长度字符串(0<=M<=255)M字符
varchar(M)最大长度为M,可变长度字符串(0<=M<=65535)变长度
tinytext微型文本串28-1字节
text文本串216-1字节

日期和时间类型

类型说明
DATEYYYY-MM-DD,日期格式
TIMEHH:MM:SS,时间格式
DATETIMEYYYY-MM-DD hh:mm:ss
TIMESTAMPYYYYMMDDhhmmss格式表示的时间戳
YEARYYYY格式的年份值

4.5、字段属性

unsigned

  • 无符号的
  • 声明该数据列不允许负数

zerofill

  • 0填充的
  • 不足位数的用0来填充 , 如int(3),5则为005

auto_increment

  • 自动增长的 , 每添加一条数据 , 自动在上一个记录数上加 1(默认)
  • 通常用于设置主键的属性 , 且为整数类型

null和not null

  • 如果设置为null,该列可以为空
  • 如果设置为NOT NULL , 则该列必须有值

default

  • 用于设置默认值
  • 例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值
CREATE TABLE student 
( id int(4) NOT NULL AUTO_INCREMENT COMMENT '学号', 
name varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', 
pwd varchar(20) NOT NULL DEFAULT '123456' COMMENT '密码', 
sex varchar(2) NOT NULL DEFAULT '男' COMMENT '性别', 
birthday datetime DEFAULT NULL COMMENT '生日', 
address varchar(100) DEFAULT NULL COMMENT '地址', 
PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8

-- 查看数据库的定义 
SHOW CREATE DATABASE school;
 -- 查看数据表的定义 
SHOW CREATE TABLE student; 
 -- 显示表结构 
DESC student;

4.6、数据库引擎

-- 查看mysql所支持的引擎类型 (表类型) 
SHOW ENGINES; 

MySQL的数据表的类型 : MyISAM , InnoDB ,CSV等…

MyISAM与InnoDB的比较:

名称MyISAMInnoDB
事务处理不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大,约2倍

适用场景:

  • 适用 MyISAM : 节约空间及相应速度
  • 适用 InnoDB : 安全性 , 事务处理及多用户操作数据表

4.7、修改数据库

修改表 ( ALTER TABLE )

修改表名 : ALTER TABLE 旧表名 RENAME AS 新表名
添加字段 : ALTER TABLE 表名 ADD字段名 列属性[属性]
修改字段 :

  • ALTER TABLE 表名 MODIFY 字段名 列类型[属性]
  • ALTER TABLE 表名 CHANGE 旧字段名 新字段名 列类型[属性]

注意:modify只能改字段数据类型和约束,不能改字段名,但是change可以。

删除字段 : ALTER TABLE 表名 DROP 字段名

删除数据表

语法: DROP TABLE [IF EXISTS] 表名

  • IF EXISTS 为可选 , 判断是否存在该数据表
  • 如删除不存在的数据表会抛出错误

其他

1.可用反引号(`)为标识符(库名、表名、字段名、索引、别名)包裹,以避免与关键字重名!中文 也可以作为标识符!

2.注释:

  • 单行注释: # 注释内容
  • 多行注释: /* 注释内容 */
  • 单行注释: -- 注释内容 (标准SQL注释风格,要求双破折号后加一空格符(空格、TAB、 换行等))

3.模式通配符:

  • _ 任意单个字符
  • % 任意多个字符,甚至包括零字符

4.SQL对大小写不敏感 (关键字)

5、MySQL数据管理

5.1、外键

什么是外键?

在实际操作中,将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表

外键作用
保持数据一致性、完整性,主要目的是控制存储在外键表中的数据、约束。使两张表形成关联,外键只能引用外表中的列的值或使用空值。

如何创建外键

方式一:建表时指定外键约束

-- 年级表 (id\年级名称)
create table grade(
gradeid int not null auto_increment comment '年级id',
gradename varchar(50) not null comment '年级名称',
primary key(gradeid)
)engine=InnoDB default charset=utf8;

-- 学生信息表 (学号,姓名,性别,年级,出生日期,地址)
CREATE TABLE student 
( id int(4) NOT NULL AUTO_INCREMENT COMMENT '学号', 
name varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', 
sex varchar(2) NOT NULL DEFAULT '男' COMMENT '性别', 
gradeid int not null comment '学生的年级', 
birthday datetime DEFAULT NULL COMMENT '生日', 
address varchar(100) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (id),
foreign key(gradeid) references grade(gradeid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

方式二:建表后修改

-- 年级表 (id\年级名称)
create table grade(
gradeid int not null auto_increment comment '年级id',
gradename varchar(50) not null comment '年级名称',
primary key(gradeid)
)engine=InnoDB default charset=utf8;

-- 学生信息表 (学号,姓名,性别,年级,出生日期,地址)
CREATE TABLE student 
( id int(4) NOT NULL AUTO_INCREMENT COMMENT '学号', 
name varchar(30) NOT NULL DEFAULT '匿名' COMMENT '姓名', 
sex varchar(2) NOT NULL DEFAULT '男' COMMENT '性别', 
gradeid int not null comment '学生的年级', 
birthday datetime DEFAULT NULL COMMENT '生日', 
address varchar(100) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 创建子表完毕后,修改子表添加外键 
ALTER TABLE student 
ADD CONSTRAINT FK_gradeid FOREIGN KEY (gradeid) REFERENCES grade (gradeid);

删除外键

注意 : 删除具有主外键关系的表时 , 要先删从表 , 后删主表

-- 删除外键 
ALTER TABLE student DROP FOREIGN KEY FK_gradeid; 
-- 发现执行完上面的,索引还在,所以还要删除索引 
-- 注:这个索引是建立外键的时候默认生成的 
ALTER TABLE student DROP INDEX FK_gradeid;

以上的操作都是物理外键(数据库级别的外键),我们不建议使用!

推荐:

  • 数据库就是单纯的表,只用来存数据,只有行和列
  • 我们想使用多张表的数据时,使用逻辑外键(程序去实现)

5.2、DML语言

DML语言 : 数据操作语言,用于操作数据库对象中所包含的数据

包括 :

  • INSERT (添加数据)
  • UPDATE (更新数据)
  • DELETE (删除数据)

5.3、添加数据

INSERT

语法:

INSERT INTO 表名[(字段1,字段2,字段3,···)] VALUES(1,2,3,···)

注意 :

  • 字段或值之间用英文逗号隔开 。
  • ’ 字段1,字段2…’ 该部分可省略 , 但添加的值务必与表结构,数据列,顺序相对应,且数量一致 。
  • 可同时插入多条数据 , values 后用英文逗号隔开。
-- 由于主键自增,可以不用插入主键的值
insert into grade (gradename) values('大四');

-- 插入多行数据
insert into grade (gradename) values('大三'),('大二'),('大一');

5.4、修改数据

UPDATE

语法:

UPDATE 表名 SET 列名=value [,列名=value2,...] [WHERE 条件];

注意 :

  • value 为修改后的数据 , 可以为变量 , 具体指表达式或者嵌套的SELECT结果
  • 条件若不指定则修改该表的所有列数据
-- 修改年级信息
update grade set gradename='高一' where gradeid=1;
-- 修改学生信息
update student set birthday=current_time where name='小葱';

常用查询条件

查询条件运算符
比较=,>,<,>=,<=,!=,<>
确定范围between…and…,not between…and…
确定集合in,not in
字符匹配like,not like
空值is null,is not null
逻辑运算and,or,not

5.5、删除数据

DELETE

语法:

DELETE FROM 表名 [WHERE 条件];

注意:如不指定条件,则删除该表的所有列数据。

TRUNCATE

作用:用于完全清空表数据 , 但表结构 , 索引 , 约束等不变 ;

语法:

TRUNCATE [TABLE] 表名;

TRUNCATE与DELETE的区别:

  • 相同 :
    • 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
  • 不同 :
    • 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
    • 使用TRUNCATE TABLE不会对事务有影响

同样使用DELETE清空不同引擎的数据库表数据,重启数据库服务后

  • InnoDB : 自增列从初始值重新开始 (因为是存储在内存中,断电即失)
  • MyISAM : 自增列依然从上一个自增数据基础上开始 (存在文件中,不会丢失)

6、查询数据

6.1、DQL语言

DQL( Data Query Language 数据查询语言 )

SELECT

语法:

SELECT [ALL | DISTINCT] 列名 [,<列名>]...
FROM table_name [as table_alias] 
[left | right | inner join table_name2] -- 联合查询 
[WHERE ...] -- 指定结果需满足的条件 
[GROUP BY ...] -- 指定结果按照哪几个字段来分组 
[HAVING] -- 过滤分组的记录必须满足的次要条件 
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序 
[LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查询的记录从哪条至哪条

6.2、指定查询字段

-- 查询所有学生信息 
SELECT * FROM student; 

-- 查询指定列(学号 , 姓名) 
SELECT studentno,studentname FROM student;

AS取别名

作用:

  • 可给数据列取一个新别名
  • 可给表取一个新别名
  • 可把经计算或总结的结果用另一个新名称来代替
-- 这里是为列取别名(当然as关键词可以省略) 
SELECT studentno AS 学号,studentname AS 姓名 FROM student;

-- 使用as也可以为表取别名 
SELECT studentno AS 学号,studentname AS 姓名 FROM student AS s; 

-- 使用as,为查询结果取一个新名字 
-- CONCAT()函数拼接字符串 
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student; 

DISTINCT去重

作用 : 去掉SELECT查询返回的记录结果中重复的记录

-- # 查看哪些同学参加了考试(学号) 去除重复项
select distinct studentno from result;

使用表达式的列

select 表达式 from;

数据库中的表达式 : 一般由文本值 , 列值 , NULL , 函数和操作符等组成

-- 查询版本号(函数)
select version();

-- 用来计算(表达式)
select 100*3-1 as 计算结果;

-- 查询自增步长(变量)
select @@auto_increment_increment;

-- 学员考试成绩集体提分一分查看
select studentno,studentresult+1 as 提分后 from result;

6.3、where条件语句

作用:用于检索数据表中 符合条件 的记录

逻辑操作符

操作符名称描述
and或&&逻辑与
or或||逻辑或
not或!逻辑非
-- 查询考试成绩在95-100之间的
select studentno,studentresult from result 
where studentresult>=95 and studentresult<=100;

-- AND也可以写成 &&
select studentno,studentresult from result 
where studentresult>=95 && studentresult<=100;

-- 区间
select studentno,studentresult from result 
where studentresult between 95 and 100;

模糊查询

语法:

[not] like '匹配串'

谓词like可以用来进行字符串的匹配。

匹配串可以是一个完整的字符串,也可以含有通配符%和_。

  • %代表任意长度(长度可以为0)的字符串。
  • _代表任意单个字符。
-- 查询姓张的同学的学号及姓名
select studentno,studentname from student 
where studentname like '张%';

-- 查询姓张的同学,后面只有一个字的
select studentno,studentname from student 
where studentname like '张_';

-- 查询姓名中含有 强 字的
select studentno,studentname from student 
where studentname like '%强%';

IN(集合)

-- 查询学号为1000,1001,1002的学生姓名
select studentno,studentname from student 
where studentno in (1001,1002,1003);

NULL

-- 查询出生日期没有填写的学生姓名
select studentname from student where borndate is null;

-- 查询出生日期填写的学生姓名
select studentname from student where borndate is not null;

6.4、连接查询

join


连接查询:
如需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询 。

内连接 inner join

  • 查询两个表中的结果集中的交集

左外连接 left join

  • 以左表作为基准,右边表来一 一匹配,匹配不上的,返回左表的记录,右表以NULL填充

右外连接 right join

  • (以右表作为基准,左边表来一 一匹配,匹配不上的,返回右表的记录,左表以NULL填充

subject表:

result表:

grade表:

student表:

-- 查询参加了考试的同学信息(学号,学生姓名,科目编号,分数)
-- 内连接
select s.studentno,studentname,subjectno,studentresult 
from student s 
inner join result r 
on s.studentno=r.studentno;

-- 右连接(也可实现)
select s.studentno,studentname,subjectno,studentresult 
from student s 
right join result r 
on s.studentno=r.studentno;

-- 等值连接
select s.studentno,studentname,subjectno,studentresult 
from student s,result r 
where s.studentno=r.studentno;

-- 左连接 (查询了所有同学,没参加考试的也会查出来)
select s.studentno,studentname,subjectno,studentresult 
from student s 
left join result r 
on s.studentno=r.studentno;

-- 查一下缺考的同学(左连接应用场景)
select s.studentno,studentname,subjectno,studentresult 
from student s 
left join result r 
on s.studentno=r.studentno 
where studentresult is null;

-- 查询参加了考试的同学信息(学号,学生姓名,科目名,分数)
select s.studentno,studentname,subjectname,studentresult 
from student s 
inner join result r 
on s.studentno=r.studentno 
inner join subject sub 
on sub.subjectno=r.subjectno;

自连接

数据表与自身进行连接

-- 创建一个表
CREATE TABLE `category`( 
`categoryid` INT(10) NOT NULL auto_increment COMMENT '主题id', 
`pid` INT(10) NOT NULL COMMENT '父id', 
`categoryname` VARCHAR(50) NOT NULL COMMENT '主题名字', 
PRIMARY KEY (`categoryid`) 
) ENGINE=INNODB default CHARSET=utf8; 

-- 插入数据
INSERT INTO `category` (`categoryid`, `pid`, `categoryname`) 
VALUES ('2', '1', '信息技术'),
('3', '1', '软件开发'),
('5', '1', '美术设计'),
('4', '3', '数据库'),
('8', '2', '办公信息'),
('6', '3', 'web开发'),
('7', '5', 'ps技术');

-- 编写SQL语句,将栏目的父子关系呈现出来 (父栏目名称,子栏目名称)
select a.categoryname as '父栏目',b.categoryname as '子栏目' 
from category a,category b 
where a.categoryid=b.pid;


6.5、排序和分页

order by(排序)

ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照ASC升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

-- 查询 数据库结构-1 的所有考试结果(学号 学生姓名 科目名称 成绩) 
-- 按成绩降序排序
select s.studentno,studentname,subjectname,studentresult 
from student s 
inner join result r 
on s.studentno=r.studentno 
inner join subject sub 
on sub.subjectno=r.subjectno 
where subjectname='数据库结构-1' 
order by studentresult desc;

limit 分页

好处 : (用户体验,网络传输,查询压力)

语法 :

select * from tableName limit i,n 

参数:

  • tableName : 为数据表
  • i : 为查询结果的索引值(默认从0开始)
  • n : 为查询结果返回的数量(页面大小)
select * from result limit 0,5;

推导:

  • 第一页 : limit 0,5
  • 第二页 : limit 5,5
  • 第三页 : limit 10,5 …
  • 第N页 : limit (pageNo-1)*pageSzie,pageSzie
    [pageNo:页码,pageSize:单页面显示条数]

6.6、子查询

什么是子查询?

在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句 。

注意:

  • 嵌套查询可由多个子查询组成,求解的方式是由里及外;
  • 子查询返回的结果一般都是集合,故而建议使用IN关键字;
-- 查询 数据库结构-1 的所有考试结果(学号,科目编号,成绩),并且成绩降序排列
-- 方法一:使用连接查询
select studentno,r.subjectno,studentresult 
from result r 
inner join subject sub 
on r.subjectno=sub.subjectno 
where subjectname='数据库结构-1' 
order by studentresult desc;

-- 方法二:使用子查询(执行顺序:由里及外)
select studentno,subjectno,studentresult 
from result 
where subjectno=(
	select subjectno from subject 
	where subjectname='数据库结构-1'
) 
order by studentresult desc;

7、MySQL函数

7.1、常用函数

官方文档

数据函数

-- 绝对值
select abs(-8);
-- 向上取整
select ceiling(9.4);
-- 向下取整
select floor(5.6);
-- 返回一个0-1之间的随机数
select rand();
-- 返回参数的符号: 负数返回-1,正数返回1,0返回0
select sign(7);

字符串函数

-- 字符串长度
select char_length('再小的帆也能远航');
-- 拼接字符串
select concat('我','爱','编程');
-- 转小写
select lower('ENGLISH');
-- 转大写
select upper('english');
-- 替换字符串
select replace('狂神说坚持就能成功','坚持','努力');

-- 查询姓张的同学,改成刘
select replace(studentname,'张','刘') 
from student 
where studentname like '张%';

日期和时间函数

-- 获取当前日期
select current_date();
-- 获取当前日期和时间
select now();
-- 本地时间
select localtime();
-- 系统日期
select sysdate();

-- 获取年月日,时分秒 
SELECT YEAR(NOW()); 
SELECT MONTH(NOW()); 
SELECT DAY(NOW()); 
SELECT HOUR(NOW()); 
SELECT MINUTE(NOW()); 
SELECT SECOND(NOW());

系统信息函数

-- 版本
select version();
-- 用户
select user();

7.2、聚合函数

函数名称描述
count(*)统计元组个数
count( [ distinct | all ] 列名)统计一列中值的个数
sum( [ distinct | all ] 列名)计算一列值的总和(此列必须是数值型)
avg( [ distinct | all ] 列名)计算一列值的平均值(此列必须是数值型)
max( [ distinct | all ] 列名)求一列值的最大值(数值字段或字符字段)
min( [ distinct | all ] 列名)求一列值的最小值(数值字段或字符字段)
-- 查询学生表中有多少学生
select count(studentno) from student;/*忽略为null的值*/
select count(*) from student;
select count(1) from student;

count(*) 包括了所有的列,相当于行数,在统计结果的时候,包含字段为null 的记录。
count(1) 用1代表代码行,在统计结果的时候,包含字段为null 的记录 。

三者比较:
count(1)和count(*)都会对全表进行扫描,统计所有记录的 条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。而count(字段)则与前两者不 同,它会统计该字段不为null的记录条数。

执行效率:

  • 列名为主键,count(列名)会比count(1)快。
  • 列名不为主键,count(1)会比count(列名)快。
  • 若表格只有一个字段,则count(*)效率最优。
select sum(studentresult) as 总和 from result;
select avg(studentresult) as 平均分 from result;
select max(studentresult) as 最高分 from result;
select min(studentresult) as 最低分 from result;
-- 查询不同课程的平均分,最高分,最低分
-- 前提:根据不同的课程进行分组
select subjectname,avg(studentresult),max(studentresult),min(studentresult) 
from result r 
inner join subject s 
on r.subjectno=s.subjectno 
group by r.subjectno;

-- 增加一个条件:平均分大于80
select subjectname,avg(studentresult) as 平均分,max(studentresult),min(studentresult) 
from result r 
inner join subject s 
on r.subjectno=s.subjectno 
group by r.subjectno 
having 平均分>80;

注意:
分组之后的筛选 要使用having… 因为having是从前面筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选。

8、MD5 加密

什么是MD5?

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。

实现数据加密

-- 新建一个表test
create table test(
	id int not null,
	name varchar(20) not null,
	pwd varchar(50) not null,
	primary key(id)
)engine=InnoDB default charset=utf8;

-- 插入数据
insert into test values(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456');

-- 对pwd这一列数据进行加密
update test set pwd=MD5(pwd);

--插入新的数据自动加密
insert into test values(4,'xiao',md5('123456'));

-- 查询用户信息(密码已被md5加密)
select * from test where name='zhangsan' and pwd=md5('123456');

9、事务

9.1、概述

数据库事务,点击链接。

四种隔离级别

在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事物的隔离性,会发生的几种问题:

  1. 脏读
    脏读是指在一个事务处理过程中读取了另一个未提交的事务中的数据。
  2. 不可重复读
    不可重复读是指对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
    不可重复读和脏读的区别是:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
  3. 幻读
    一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。
    幻读和不可重复读都是读取了另一条已经提交的事务(这点与脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体。

四种隔离级别

  • read uncommitted(读未提交):最低级别,以上问题均无法解决。
  • read committed(读已提交):可避免脏读情况发生。
  • repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • serializable(串行化):最严格的事务隔离级别,要求所有事务被串行化执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。

很多人容易混淆不可重复读和幻读

不可重复读的重点在于update和delete,而幻读的重点在于insert。避免不可重复读需要锁行(某一行在select操作时,不允许update和delete),避免幻读则需要锁表。

9.2、事务实现

-- 使用set语句来改变自动提交模式 
SET autocommit = 0; /*关闭*/ 
SET autocommit = 1; /*开启*/

注意:

  • 1.MySQL中默认是自动提交
  • 2.使用事务时应先关闭自动提交
-- 开始一个事务,标记事务的起始点 
START TRANSACTION

-- 提交一个事务给数据库 
COMMIT

-- 将事务回滚,数据回到本次事务的初始状态 
ROLLBACK

-- 还原MySQL数据库的自动提交 
SET autocommit =1;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值