文章目录
学习内容来自 B 站韩顺平老师的 Java 基础课
mysql 事务
事务的定义:
- 用于保证数据的一致性,由一组相关的 dml 语句组成。该组语句要么全部执行成功,要不全部执行失败。
- 如转账就需要用事务来处理,用以保持数据一致性
事务和锁
当执行事务操作时,mysql 会在表上加锁,防止其他用户改表的数据
基本操作
- start transaction – 开始一个事务
- savepoint 保存点名 – 设置保存点
- rollback to 保存点名 --回退事务
- rollback – 回退全部事务
- commit – 提交事务,事务的所有操作生效,不能回退
事务细节
mysql 事务隔离级别
事务隔离级别定义了事务与事务之间的隔离程度
注,√ 表示可能会出现,× 表示不会出现
设置隔离级别的语法:
set session transaction isolation level 隔离级别
该语句会更改当前数据库连接的隔离级别
查看和设置隔离级别
查看当前会话隔离级别的方法:
select @@tx_isolation;
查看系统当前隔离级别的方法
select @@global.tx_isolation;
设置当前会话隔离级别
set session transaction isolation level 隔离级别;
设置系统当前隔离级别
set global transaction isolation level 隔离级别;
注意:
- mysql 默认的隔离级别是可重复读(repeatable read)
- 一般情况下,没有特殊需求,不做修改
修改默认隔离级别的方法
打开 mysql 的安装目录,在安装的根目录下会有配置文件 my.ini ,打开后修改(如果没有则添加)隔离级别:
# 可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction-isolation = 隔离级别参数
这个过程需要先重启 mysql 服务后才能生效
关闭 mysql 服务,在命令行运行(管理员模式)
net stop mysql
启动服务
net start mysql
事务的ACID特性
存储引擎
Mysql 表类型由存储引擎(storage engine)决定,常用的包括:MYISAM, InnoDB, MEMORY 等
Mysql 数据表主要支持六种类型,分别是
- CSV
- Memory
- ARCHIVE
- MRG_MYISAM
- MYISAM
- InnoDB
这六种又分为两类:事务安全型,比如 InnoDB;其余都属于非事务安全型,如 MYISAM 和 MEMORY
查看存储引擎
show engines;
主要的 存储引擎/表类型 特点
如何选择存储引擎
- 如果应用不需要事务,只是处理基本的 CRUD 操作,那么 MYISAM 最好,速度快
- 如果需要支持事务,选择 InnoDB
- Memory 存储引擎就是将数据存储在内存中,由于没有磁盘 I/O 的等待,速度极快,但是所有修改会在服务关闭后丢失。(经典用法,用户的在线状态)
修改存储引擎
alter tablbe 表名 engine = 存储引擎;
视图
假如有需求:
基本概念:
- 视图是一个虚拟表,其内容由查询定义。和真实的表一样,视图包含列,其数据来自对应的真实表
- 通过视图可以修改对应的真实表的数据
- 对应真实表数据若改变,视图也会改变
对于上面那个需求,在某个用户查询时,可以将允许其查看的列形成一个视图,然后让该用户查询视图即可
基本使用
创建
create view 视图名 as select语句
修改
alter view 视图名 as select语句
查看视图
desc 视图名
查看创建视图时的语句
show create view 视图名
删除
drop view 视图名1, 视图名2
例子:
实现上一节提出的需求
create view emp_view01
as
select empno, ename, job, depto from emp;
视图相关细节
- 创建视图后,到数据库源文件去看,视图只对应有一个试图结构文件 .frm,没有数据文件
- 视图与基表的数据变化会互相影响
- 视图可以再对应另一个视图,套娃
视图的优点
例子:
基于 emp、dept、salgrade 三张表,创建一个视图
create view union_view
as
select empno, ename, dname, grade
from emp, dept, salgrade
where emp.deptno = dept.deptno and
(sal between losal and hisal);
mysql 管理
mysql 中的用户,都存储在系统数据库 mysql 中 user 表
user 表的重点字段说明:
- host:允许登陆的”位置“,localhost 表示该用户只允许本机登录,也可能为 ip 地址,表示该用户只能从某个 ip 登录
- user:用户名
- authentication_string:密码,是通过 password() 加密后的密码
创建用户
create user '用户名'@'允许登录位置' identified by 密码
删除用户
drop user '用户名'@'允许登录位置'
用户管理的目的
- 根据不同用户需求,创建不同的账号,设置相应的权限,防止有越权行为发生
- 不同用户,因为权限的限制,可以操作的库和表可能不同
修改用户密码
修改自己的密码
set password = password('密码');
修改他人密码(需要有修改其他用户密码的权限)
set password for '用户名'@'登陆位置' = password(密码)
mysql 中的权限
给用户授权
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by 密码]
参数说明:
- 权限列表,多个权限用逗号隔开。可以用 all [privileges] 表示所有权限
- *.* :表示本系统所有数据库的所有对象
- 库.* :表示某个数据库的所有对象
- identified by 加上后,如果对应用户存在,那么其后的密码将为用户的新密码;如果用户不存在,表示创建新用户
如果权限没有生效,可以刷新
flush priviledges;
回收用户权限
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
删除用户
drop user '用户名'@'登陆位置';
其他细节
- 在创建用户的时候,如果不指定位置,则默认为 %,表示所有 IP 都有连接权限
create user
xxx create user
‘xxx’@‘192.168.1.%’ 表示 xxx 用户在24位前缀为 192.168.1 的 ip 都可以登录- 在删除用户的时候,如果登陆位置不为 %,那么需要明确指定 ip