Innodb核心特性
Clustered index 聚簇索引
Change buffer insert update delete 缓冲区
自适应hansh索引:AHI ,索引的索引 ,内部维护
事物:
什么是事物?
事物是伴随着《交易类》的业务场景
保证交易的“和谐。
交易?
物换物:麦子换面粉,豆子换豆腐
货币换物:实物货币换货品,虚拟货币换货品。
法律或道德的约束,和谐的交易是什么类型?
计算机中:
例如:A 发红包 B
开启1个事物。
A:账户(100元): a - 50 update 余额 50
B:账户(0元): b + 50 update 余额 50
事物结束。
事物的ACID特性:
A atomicity:原子性
初中:原子是物质的最小构成单元,具备不可再分的特性
在一个事物工作单元中,所有的标准事物语句(DML),
要么全部成功,要么全部失败(回滚)。
C consistency:一致性
事物发生前,中,后都应该保证数据始终一致的状态。
mysql的各项功能的设计,都是最终保证一致性。
I isolation:隔离性
mysql 可以支持多事物并发工作的系统。
某个事物工作的时候,不能受到其他事物的影响。
D durability:持久性
当事物提交(commit命令执行成功),此次事物操作
的所有数据,都要落盘,都要永久保存。不会因为数据实例发生故障,而导致数据失效。
事物的生命周期管理
标准的事物控制语句
begin / start transaction;开始事物
commit ;提交事物
rollback; 回滚事物
标准的事物语句(只包含dML语句)
insert ,update,delete,select
自动提交功能
select @@autocommit;值为1,自动提交,
在你执行dml语句时,会自动在这个DML之前加一个 begin;
begin; 自动
delete 。。。
commit;自动
使用场景,autocommit=1 ,一般适合于非交易类业务场景。
如果是交易类业务:
方案一:autocommit = 0;commit;必须手动执行。
方案二:autocommit =1;每次想要发生事物型操作,
begin 和commit;都手工操作。
值为0,需要手动提交。
autocommit设置方法:
临时方法:set global autocommit = 0 ; 对新会话生效
永久生效:vi /etc/my.cnf
autocommit = 0
隐式事物控制语句
隐式提交:
设置了autocommit = 1
2.ddl ,dcl 等非dml 语句,会触发隐式提交。
导致提交的非事物语句:
ddl语句:alter,create,drop
dcl语句:grant,revoke,set password
锁定语句:lock tables 和 unlock tables
导致隐式提交的语句示例:
truncate table
load data infile
select for update
隐式回滚:
会话关闭
数据库宕机
事物语句执行失败
Innodb事物的acid如何保证的?
名词介绍:
1)重做日志 (redo log)
redo log:重做日志 ib_logfile0~N 48,轮询使用
记录的是数据页的变化。
redo log buffer:redo内存区域
2)数据页存储位置
idb:存储数据行和索引
buffer pool:缓冲区池,数据和索引的缓冲
3)LSN 日志序列号
磁盘数据页,redo文件,buffer pool,redo buffer
mysql每次数据启动,都会比较磁盘数据页和redo_log的LSN,
必须要求两者LSN一致才会正常启动。
4)WAL:write ahead log 日志优先写的方式实现持久化
5)脏页:内存脏页,内存中发生了修改,没有写到磁盘之前,
我们把内存页称之为脏页。
6)CKPT:checkpoint,检查点,就是将脏页刷写到磁盘的动作
7)事物号,Innodb会为每一个事物生成一个事物号,伴随着整个事物。
8)undo:存储在ibdata1,存储了事物工作过程中的回滚信息
Innodb事物的工作流程
重做日志 (redo log)
redo log:重做日志 ib_logfile0~N 48,轮询使用
记录的是数据页的变化。
redo log buffer:redo内存区域
作用:在事物中,实现持久化的作用。
redo buffer:数据页的变化信息,数据页当时的LSN号。
redo的刷新策略
commit;刷新当前事物的redo buffer到磁盘。
还会顺便将一部分redo buffer中没有提交的事物也刷新到磁盘。
补充:redo存储的是在事物工作过程中,数据页变化。
commit时会立即写入磁盘(默认),日志落盘成功commit;
正常mysql工作中,主要的作用数提供快速持久化的功能。
mysql出现crash异常宕机时,主要提供的是前滚功能。(CSR)
双一标准:
innodb_flush_log_at_trx_commit = 0 / 1 / 2
1:在每次事物提交时,会立即刷新redo buffer 到磁盘
0:每秒刷新redo buffer 到os cache,再fsync到磁盘,异常宕机会导致丢失1秒内的事物
2:每次事物提交,都立即刷新redo buffer到os cache,每秒刷新fsync()到磁盘.异常宕机会导致丢失1秒内的事物
目前默认是1:
另外
1.redo buffer的刷新还和操作系统的缓存有关,所以redo buffer的刷新策略可能和
innodb_flush_method参数有一定关系。
2.redo 也有group commit;事物的redo buffer到磁盘。
还会顺便将一部分redo buffer中没有提交的事务也刷新到磁盘(会加一些标记未提交的事务)
undo log :
存储在ibdata1,存储了事物工作过程中的回滚信息
作用:
在事务acid过程中,实现了A原子性的作用
另外ci也依赖与undo
在rollback时,将数据恢复到修改之前的状态。
在csr现实的是,将redo当中记录的未提交的进行回滚。
undo提供快照技术,保存事物修改之前的数据状态,
保证了MVCC,隔离性,msyqldump热备份。
undo 回滚过程也会继续redo日志.
什么是一致性快照:
每个事务开始时,都会生成一个一致性快照。
undo提供快照技术,保存事务修改之前的数据状态。
保证了MVCC,隔离性,msqldump的热备恢复机制。
隔离级别和锁机制
作用:主要是提供i的特性,另外对于c的特性也有保证。
1)隔离性 transaction_isolation 事物隔离性
RU:读未提交 read uncommitted
出现的问题:脏读,不可重复读,幻读
RC:读已提交
不可重复读,幻读
RR:可重复读(默认)
可重复读,可能出现幻读(另一个会话insert 数据时)
SR:可串行化
串行化事物。以上的问题都能规避。
读什么意思?
这里的读不代表select,而指的存储引擎的读,是page的读取。
修改参数:
select @@transaction_isolation;
set global transaction_isolation=read-uncommitted;
脏读:一般不允许出现。
可重复读:允许的情况下可以出现。
可重复读:默认情况
幻读:一般情况是允许的
RC 级别为了解决幻读,加了GAP锁.