mysql 存储引擎INNODB特性

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隐式提交范例

导致提交的非事物语句:

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)


redo 前滚

双一标准:

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锁.

你可能感兴趣的:(mysql 存储引擎INNODB特性)