OldWang带你了解MySQL(十)

文章目录

    • MySQL事务
    • 使用事务
    • 事务的并发问题
    • MySQL的用户管理
    • MySQL分页查询

MySQL事务

事务简介

事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

事务定义(Transaction)
⭐ 事务是一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)
⭐ 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成
⭐ 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同

事务四大特征(ACID)

⭐ 原子性(ATOMICITY)

事务中的操作要么都不做,要么就全做。

⭐ 一致性(CONSISTENCY)

一个事务应该保护所有定义在数据上的不变的属性(例如完整性约束)。
在完成了一个成功的事务时,数据应处于一致的状态。

⭐ 隔离性(ISOLATION)

一个事务的执行不能被其他事务干扰。

⭐ 持久性(DURABILITY)

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

事务类型

⭐ 显式事务

需要我们手动的提交或回滚。
DML 语言中的所有操作都是显示事务操作。

⭐ 隐式事务

数据库自动提交不需要我们做任何处理,同时也不具备回滚性。DDL、DCL 语言都是隐式事务操作

使用事务

TCL语句 描述
start transaction 事务开启
commit 事物提交
rollback 事物回滚

示例一:

创建account账户表,包含id、卡号、用户名、余额。

create table account(id int primary key auto_increment,cardnum varchar(20) not null,username varchar(30) not null,balance double(10,2));

示例二:

向account表中插入两条数据。

insert into account(cardnum,username,balance)
VALUES('123456789','张三',2000);
insert into account(cardnum,username,balance)
VALUES('987654321','李四',2000);

示例三:

在一个事务中完成转账业务。

START TRANSACTION
update account set balance = balance-200 where cardnum = '123456789';
update account set balance = balance+200 where cardnum = '987654321';
select * from account;
-- 当我们关闭数据库重新打开后,张三和李四的账户余额并没发生任何变化。
-- 这是因为当我们使用“START TRANSACTION”开启一个事务后,该事务的提交方式不再是自动的,
-- 而是需要手动提交,而在这里,我们并没有使用事务提交语句COMMIT,
-- 所以对account表中数据的修改并没有永久的保存到数据库中,也就是说我们的转账事务并没有执行成
功
-- 提交转账事务
commit;
-- 事务的回滚让数据库恢复到了执行事务操作前的状态。
-- 需要注意的是事务的回滚必须在事务提交之前,因为事务一旦提交就不能再进行回滚操作。
rollback;

事务的并发问题

脏读(读取未提交数据)

指一个事务读取了另外一个事务未提交的数据。

A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。

不可重复读(前后多次读取,数据内容不一致)

在一个事务内读取表中的某一行数据,多次读取结果不同。

事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。

幻读(前后多次读取,数据总量不一致)

是指在一个事务内读取到了别的事务插入的数据,导致前后读取数量总量不一致。

事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

事务的隔离级别

事务的隔离级别用于决定如何控制并发用户读写数据的操作。数据库是允许多用户并发访问的,如果多个用户同时开启事务并对同一数据进行读写操作的话,有可能会出现脏读、不可重复读和幻读问题,所以MySQL中提供了四种隔离级别来解决上述问题。

事务的隔离级别从低到高依次为
⭐ READ UNCOMMITTED
⭐ READ COMMITTED
⭐ REPEATABLE READ
⭐ SERIALIZABLE

隔离级别越低,越能支持高并发的数据库操作。
OldWang带你了解MySQL(十)_第1张图片

查看MySQL默认事务隔离级别

SELECT @@transaction_isolation;

设置事务隔离级别

对当前session有效。

set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

MySQL的用户管理

MySQL 是一个多用户的数据库系统,按权限,用户可以分为两种: root 用户,超级管理员,和由 root用户创建的普通用户。

用户管理

创建用户

CREATE USER username IDENTIFIED BY 'password';

查看用户

SELECT USER,HOST FROM mysql.user;

示例:

创建一个 u_sxt 的用户,并查看创建是否成功。

create user u_sxt IDENTIFIED by 'sxt';
select user,host from mysql.user;

权限管理

新用户创建完后是无法登陆的,需要分配权限。
GRANT 权限 ON 数据库.表 TO 用户名@登录主机 IDENTIFIED BY “密码”

登陆主机:

字段 含义
% 匹配所有主机
localhost localhost 不会被解析成 IP 地址,直接通过 UNIXsocket 连接
127.0.0.1 会通过 TCP/IP 协议连接,并且只能在本机访问
:: 1 ::1 就是兼容支持 ipv6 的,表示同 ipv4 的 127.0.0. 1

权限列表

权 限 作用范围 作 用
all [privileges] 服务器 所有权限
select 表、列 选择行
insert 表、列 插入行
update 表、列 更新行
delete 删除行
create 数据库、表、索引 创建
drop 数据库、表、视图 删除
reload 服务器 允许使用flush语句
shutdown 服务器 关闭服务
process 服务器 查看线程信息
file 服务器 文件操作
grant option 数据库、表、存储过程 授权
references 数据库、表 外键约束的父表
index 创建/删除索引
alter 修改表结构
show databases 服务器 查看数据库名称
super 服务器 超级权限
create temporary tables 创建临时表
lock tables 数据库 锁表
execute 存储过程 执行
replication client 服务器 允许查看主/从/二进制日志状态
replication slave 服务器 主从复制
create view 视图 创建视图
show view 视图 查看视图
create routine 存储过程 创建存储过程
alter routine 存储过程 修改/删除存储过程
create user 服务器 创建用户
event 数据库 创建/更改/删除/查看事件
trigger 触发器
create tablespace 服务器 创建/更改/删除表空间/日志文件
proxy 服务器 代理成为其它用户
usage 服务器 没有权限

示例:

为oldwang用户分配只能查询 student 库中的 emp 表,并且只能在本机登陆的权限。

grant select ON student.emp to 'oldwang'@'localhost' IDENTIFIED by 'oldwang';

刷新权限

每当调整权限后,通常需要执行以下语句刷新权限。

FLUSH PRIVILEGES;

删除用户

DROP USER username@localhost;

MySQL分页查询

OldWang带你了解MySQL(十)_第2张图片

MySQL 分页查询原则:

⭐ 在 MySQL 数据库中使用 LIMIT 子句进行分页查询。
⭐ MySQL 分页中开始位置为 0。
⭐ 分页子句在查询语句的最后侧。

LIMIT子句

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 开始位置,查询数量;

LIMIT OFFSET子句

SELECT 投影列 FROM 表名 WHERE 条件 ORDER BY LIMIT 查询数量 OFFSET 开始位置;

你可能感兴趣的:(mysql,数据库,sql)