MySQL的存储引擎(二)Innodb核心特性——事务
Innodb核心特性——事务
1.什么是事务
主要针对DML语句(update,delete,insert)
一组数据操作执行步骤,这些步骤被视为一个工作单元:
1)用于对多个语句进行分组
2)可以在多个客户机并发访问同一个表中的数据时使用
所有步骤都成功或都失败
1)如果所有步骤正常,则执行
2)如果步骤出现错误或不完整,则取消
2.事务的通俗理解:伴随着“交易”出现的数据库概念。
我们理解的“交易”是什么?
1、物与物的交换(古代)
2、货币现金与实物的交换(现代1)
3、虚拟货币与实物的交换(现代2)
4、虚拟货币与虚拟实物交换(现代3)
数据库中的“交易”是什么?
1、事务又是如何保证“交易”的“和谐”?
2、ACID
3.事务ACID特性
Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该。 事务期间将保留一致状态。
Isolated(隔离性)
事务之间不相互影响。
Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在 数据库中。所做的更改不会丢失。
4.事务流程举例
5.事务的控制语句
如下:
START TRANSACTION(或 BEGIN):显式开始一个新事务
SAVEPOINT:分配事务过程中的一个位置,以供将来引用
COMMIT:永久记录当前事务所做的更改
ROLLBACK:取消当前事务所做的更改
ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
RELEASE SAVEPOINT:删除 savepoint 标识符
SET AUTOCOMMIT:为当前连接禁用或启用默认 autocommit 模式
1、一个成功事务的生命周期
begin;
sql1
sql2
sql3
...
commit;
2、一个失败事务的生命周期
begin;
sql1
sql2
sql3
...
rollback;
3、自动提交
#查看自动提交 mysql> show variables like 'autocommit'; #临时关闭 mysql> set autocommit=0; #永久关闭 [root@db01 world]# vim /etc/my.cnf [mysqld] autocommit=0
4.事务演示
1.成功事务
mysql> create table stu(id int,name varchar(10),sex enum('f','m'),money int); mysql> begin; mysql> insert into stu(id,name,sex,money) values(1,'zhang3','m',100), (2,'zhang4','m',110); mysql> commit;
2.事务回滚
mysql> begin; mysql> update stu set name='zhang3'; mysql> delete from stu; mysql> rollback;
5.事务隐式提交情况
1)现在版本在开启事务时,不需要手工begin,只要你输入的是DML语句,就会自动开启事务。
2)有些情况下事务会被隐式提交
例如:
在事务运行期间,手工执行begin的时候会自动提交上个事务
在事务运行期间,加入DDL、DCL操作会自动提交上个事务
在事务运行期间,执行锁定语句(lock tables、unlock tables)
load data infile
select for update
在autocommit=1的时候
6.事务日志redo基本功能
1)Redo是什么?
redo,顾名思义“重做日志”,是事务日志的一种。
2)作用是什么?
在事务ACID过程中,实现的是“D”持久化的作用。

特性:WAL(Write Ahead Log)日志优先写
REDO:记录的是,内存数据页的变化过程
3)REDO工作过程
#执行步骤
update t1 set num=2 where num=1;
1)首先将t1表中num=1的行所在数据页加载到内存中buffer page
2)MySQL实例在内存中将num=1的数据页改成num=2
3)num=1变成num=2的变化过程会记录到,redo内存区域,也就是redo buffer page中
#提交事务执行步骤
commit;
1)当敲下commit命令的瞬间,MySQL会将redo buffer page写入磁盘区域redo log
2)当写入成功之后,commit返回ok
7.redo数据实例恢复过程
8.事务日志undo
1)undo是什么?
undo,顾名思义“回滚日志”,是事务日志的一种。
2)作用是什么?
在事务ACID过程中,实现的是“A”原子性的作用。当然CI的特性也和undo有关
9.redo和undo的存储位置
#redo位置
[root@db01 data]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Mar 6 2017 ib_logfile1
#undo位置
[root@db01 data]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1
-rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2
在MySQL5.6版本中undo是在ibdata文件中,在MySQL5.7版本会独立出来。
10.事务中的锁
1)什么是“锁”?
“锁”顾名思义就是锁定的意思。
2)“锁”的作用是什么?
在事务ACID特性过程中,“锁”和“隔离级别”一起来实现“I”隔离性的作用。
排他锁:保证在多事务操作时,数据的一致性。
共享锁:保证在多事务工作期间,数据查询时不会被阻塞。
11.多版本并发控制(MVCC)
1)只阻塞修改类操作,不阻塞查询类操作
2)乐观锁的机制(谁先提交谁为准)
13.锁的粒度
MyIsam:低并发锁(表级锁)
Innodb:高并发锁(行级锁)
14.事务的隔离级别
四种隔离级别:
READ UNCOMMITTED(独立提交)
允许事务查看其他事务所进行的未提交更改
READ COMMITTED
允许事务查看其他事务所进行的已提交更改
REPEATABLE READ******
确保每个事务的 SELECT 输出一致
InnoDB 的默认级别
SERIALIZABLE
将一个事务的结果与其他事务完全隔离
#查看隔离级别 mysql> show variables like '%iso%'; #修改隔离级别为RU [mysqld] transaction_isolation=read-uncommit mysql> use oldboy mysql> select * from stu; mysql> insert into stu(id,name,sex,money) values(2,'li4','f',123); #修改隔离级别为RC [mysqld] transaction_isolation=read-commit