1.表空间
支持两类表空间:共享、独立表空间
5.5版本: 默认共享表空间模式,包含了数据字典,undo,tmp,用户表数据和索引
5.6版本: 默认独立表空间模式,包含数据字典,undo,tmp,将用户数据和索引独立,每个表单单独存储
5.7版本: 默认独立表空间模式,包含数据字典,undo,tmp被独立,将用户数据和索引独立,每个表单单独存储
8.0版本: 默认独立表空间模式,数据字典被取消,undo独立,tmp独立 ,将用户数据和索引独立,每个表单单独存储
2.功能名词介绍
transaction 事务
undo:ibdata1 回滚日志/撤销日志
tmp : ibtmp1 临时表空间
redo: ib_logfile0~N 重做日志
ibd :t1.ibd 表空间数据文件
InnoDB buffer pool: 数据缓冲区池(70-80%)
log buffer: 重做日志缓冲区
LSN 日志序列号/版本号
Trx_id 事务ID
checkpoint 检查点
3.事务
1.什么是事务
将多条DML(标准的事务语句),放在一个组中运行,要么全成功,要么全失败。
oldguo的解释:
1. 交易?
以物换物
货币换物
虚拟币换物
2.事物ACID特性
A :原子性 :每一个事务都是一个完整整体,不可再分性。要么全执行成功或者失败
C :一致性 :在事务发生前,中,后,保证事务操作的数据前后一致
I :隔离性 :多个事务之间,所作的操作互不干扰,不能同时更新同一行数据
D :持久性 :事务完成之后,所涉及的数据,必须永久有效(落地)
3.事务的生命周期管理
(1)开启一个事务
begin/ start transaction;
(2)标准的事务语句
insert
update
delete
(3)结束事务
commit; #提交事务
rollback; #回滚事务
非标准的事务生命周期
(1)自动提交机制
MySQL 5.6 以后:
1.begin子句会自动添加
2.每条语句执行完成之后都会自动提交
说明:默认情况下,开启事务时不加begin,逐条自动提交,手动开启begin命令,按照正常事务工作过程
(2)隐式提交
用于隐式提交的 SQL 语句:
begin
a
b
begin
SET AUTOCOMMIT = 1
导致提交的非事务语句:
DDL语句: (ALTER、CREATE 和 DROP)
DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
导致隐式提交的语句示例:
TRUNCATE TABLE
LOAD DATA INFILE
SELECT FOR UPDATE
(3)隐式回滚
数据库重启
会话断开
死锁
4.事务底层的工作过程
![]()
1.redo
分布:
内存区域:log buffer
磁盘区域:id_logfile0~N
功能:
1.保存内存数据页的变化
2.commit时,实现事务的快速持久化的特性:量少,顺序IO
3.宕机时,通过redo实现重做事务,将数据库恢复到宕机之前,我们把这步称之为 ACSR 中的“前滚” 操作
2.undo 回滚日志
分布: 默认 ibdate1, 5.7 开始独立undo, 8.0后自动独立
功能:
1.保存当前事务操作的反操作
2.在执行rollback命令时,undo提供回滚操作,在ACID中主要实现A的特性,CI也有部分功能
3.宕机时,ACSR过程中提供回滚操作(将没有commit标记的)
补充:ckpt是将内存中恢复的脏页立马刷新到磁盘中
3.锁 及 隔离级别主要保证隔离性
(1) 锁:
S : 共享锁,读锁
X : 排它锁,写锁
IS : 意向S
IX : 意向X
其中:S-S S-IS 兼容
X和任何锁都不兼容
IX-IS 不兼容
X-IS 不兼容
X-S 不兼容
(2) X 锁的细分
TX 表锁-------> DDL语句(更新表结构)
RX 行锁(记录锁)-------> DML语句(更新数据行)
GAPX(GAP LOCK X) 间隙锁------> 特殊的DML
Next LOCK X-------> 下一键锁定(间隙锁和行锁的结合)
(3)隔离级别 (transaction_isolation)
RU :读未提交 READ-UNCOMMITTED
RC :读已提交 READ-COMMITTED
RR :可重复读 REPEATABLE-READ
SR :串行化
RU 读未提交可能会出现的问题:
1.脏读:读到未提交的数据
2.不可重复的现象
3.幻读:所谓的幻读,是指在操作表数据时,另外的窗口插入了满足要求的值,却没有被操作。
RC 读已提交 可能会出现的问题
1.不可重复读
2.幻读
RR 可重复读
1.幻读
说明:RR级别下 + GAP + Next lock 可以防止幻读