当前位置:首页 > Mysql > 正文内容

MySQL的存储引擎(二)Innodb核心特性——事务

5年前 (2019-09-08)Mysql571

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.事务流程举例

image.png

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基本功能

image.png

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数据实例恢复过程

image.png



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


“MySQL的存储引擎(二)Innodb核心特性——事务” 的相关文章

MySQL简介及安装

MySQL安装1. rpm、yum安装安装方便、安装速度快,无法定制2. 二进制不需要安装,解压即可使用,不能定制功能3. 编译安装可定制,安装慢,步骤复杂#定制功能:存储引擎、字符集、压缩#定制安装位置、数据存放位置、文件位置(socket)#下载5.6.36包 [root@db02 ...

MySQL程序结构

MySQL程序结构

mysql是一个C/S服务结构1、mysql自带的客户端程序(/application/mysql/bin)mysqlmysqladminmysqldump2、应用程连接MySQL方式TCP/IP的连接方式套接字连接方式MySQL服务器构成1.MySQL的后台进程+线程+预分配的内存结构。2.MyS...

MySQL索引管理及执行计划

MySQL索引管理及执行计划

一.索引介绍 1.索引1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容。2)让获取的数据更有目的性,从而提高数据库检索数据的性能。2.索引类型1.BTREE:B+树索引2.HASH:HASH索引3.FULLTEXT:全文索引4.RTREE:R树索引3.索引管理索引建立在表的列上...

MySQL的备份和恢复

备份的类型冷备份:这些备份在用户不能访问数据时进行,因此无法读取或修改数据。这些脱机备份会阻止执行任何使用数据的活动。这些类型的备份不会干扰正常运行的系统的性能。但是,对于某些应用程序,会无法接受必须在一段较长的时间里锁定或完全阻止用户访问数据。温备份:这些备份在读取数据时进行,但在多数情况下,在进...

MySQL主从复制

主从复制简介1:高可用2:辅助备份3:分担负载复制是 MySQL 的一项功能,允许服务器将更改从一个实例复制到另一个实例。1:主服务器将所有数据和结构更改记录到二进制日志中。2:从属服务器从主服务器请求该二进制日志并在本地应用其内容。3:IO:请求主库,获取上一次执行过的新的事件,并存放到rela...