一、简介

1. 什么是事务

事务是由一个或多个sql语句组成一个最小的不可再分的工作单元。里面的内容要么都执行成功,要么都不成功。

2. 事务的ACID特性

  • 原子性(atomicity)
    事务是一个不可分割的工作单元,要么全部提交,要么全部失败回滚。
  • 一致性(consistency)
    一致性指事务执行前后,数据从一个合法性状态变换到另一个合法性状态。例如要满足存在的约束,满足数据的一致性等、
  • 隔离性(isolation)
    指一个事务的执行不能被其他事务干扰。
  • 持久性(durability)
    一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。

3. 存储引擎支持情况

show engines 命令可以查看mysql存储引擎支持事务的情况。

在mysql中,只有innodb是支持事务的。


二、开启事务

1. 显式事务

START TRANSACTION或BEGIN能显式的开启一个事务。

BEGIN;
# 或者
START TRANSACTION;

START TRANSACTION相较于BEGIN可以在后边跟随几个修饰符。

  • READ ONLY : 表示当前事务是一个只读事务
  • READ WRITE : 当前事务是一个读写事务
  • WITH CONSISTENT SNAPSHOT 启动一致性读(在开启事务的时候就生成Readview)

事务的相关操作如下:

COMMIT;
ROLLBACK;
ROLLBACK TO [SAVEPOINT];
SAVEPOINT 保存点名称;
RELEASE SAVEPOINT 保存点名称; #删除保存点

2. 隐式事务

如果不显式使用START TRANSACTION或BEGIN开启一个事务,那么每一条语句是一个独立的事务,这种特性叫做事务的自动提交。
如果想关闭自动提交,有两种方法:

  • 显式使用START TRANSACTION或BEGIN
  • 把系统变量autocommit的值设置为off

注意事项——隐式提交

  • 数据定义语言。当使用create、alter、drop等语句去修改数据库对象时,就会隐式提交前边语句所属的事务。
  • 当我们在一个事务还未提交或回滚时又使用START TRANSACTION或BEGIN开启一个事务时,会提交上一个事务。

三、事务的隔离级别

1. 介绍

SQL在并发事务执行过程中可能存在以下问题:

脏写、脏读、不可重复读、幻读

mysql提供四种隔离级别,用来解决并发问题:

  • READ UNCOMMITTED : 读未提交,在该隔离级别下,所有事务都可以看到其他事务未提交的数据。不能避免脏读、不可重复读、幻读。
  • READ COMMITTED : 读已提交,一个事务只能看到已经提交的事务。可以避免脏读,不能避免不可重复读、幻读。
  • REPEATABLE READ : 可重复读,事务A在读到记录后,其他事务对该记录修改后,A事务读到的还是原来的内容。可以避免脏读、不可重复读,不能避免幻读。这是mysql默认的隔离级别。
  • SERIALIZABLE : 可串行化,所有事务串行执行。

2. 设置

show variables like 'tx_isolation'; # 查看隔离级别,mysql5.7.20之前
show variables like 'transaction_isolation' # 查看隔离级别,mysql5.7.20之后
select @@transaction_isolationSET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'

四、undo日志

undo log是事务原子性的保证,在事务更新数据时需要先写入undo log。

1 作用

  • 回滚数据

用户对undo日志可能有误解:undo用于将数据库物理地恢复到执行语句或事务之前的样子。但事实并非如此。undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。所有修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。
这是因为在多用户并发系统中,可能会有数十、数百甚至数千个并发事务。数据库的主要任务就是协调对数据记录的并发访问。比如,一个事务在修改当前一个页中某几条记录,同时还有别的事务在对同一个页中另几条记录进行修改。因此,不能将一个页回滚到事务开始的样子,因为这样会影响其他事务正在进行的工作。

MVCC

undo的另一个作用是MVCC,即在InnoDB存储引擎中MNCc的实现是通过undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。

2 结构

InnoDB对undo log的管理采用段的方式,也就是回滚段(rollback segment),每个回滚段记录类1024个undo log segment

innodb_undo_directory : 设置文件所在路径。
innodb_undo_tablespaces : 设置文件数量.

undo log类型分为:

  • insert undo log

因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作

  • update undo log

该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除

3 工作流程


五、redo日志

redo log称为重做日志,提供再写入操作,恢复提交事务修改页操作,用来保证事务的持久性。
redo log记录的是物理级别上页的修改操作。

1. WAL

InnoDB的事务存储引擎,其通过Force Log at Commit机制实现事务的持久性,即当事务提交时,先将redo log buffer写入到redo log file进行持久化,待事务的commit操作完成后才算完成。这种做法也被称为Write-Ahead Log(预先日志持久化),在持久化一个数据页之前,先将内存中相应的日志持久化。

2. 刷盘策略

通过调整innodb_flush_log_at_trx_commit,支持不同的刷盘策略:

  • 0 : 表示每次事务提交时不进行刷盘操作,由系统后台线程每隔1s进行一次同步。
  • 1 : 默认为1,表示每次事务提交时都将进行同步,刷盘操作
  • 2 : 表示每次事务提交时都只写到oage cache,不进行同步,由os自己决定什么时候同步到磁盘。

MySQL高级篇——事务相关推荐

  1. MySQL高级篇——事务的隔离级别与简单应用

    文章目录: 1.数据并发所存在的问题 1.1 脏写 1.2 脏读 1.3 不可重复读 1.4 幻读 2.SQL中事务的隔离级别 3.案例实操 3.1 查看与修改MySQL的隔离级别 3.2 读未提交- ...

  2. MySQL高级篇(事务视图存储过程与函数)

    目录 一.事务 1.1什么是事务? 1.2事务的特性 1.3事务的分类 1.4事务的操作步骤 1.5事务的隔离级别(面试题常考) 二.视图 2.1视图的操作 2.1.1视图的创建 2.1.2视图更新( ...

  3. 【MySQL高级篇笔记-MySQL事务日志(下) 】

    此笔记为尚硅谷MySQL高级篇部分内容 目录 一.redo日志 1.为什么需要REDO日志 2.REDO日志的好处.特点 3.redo的组成 4.redo的整体流程 5.redo log的刷盘策略 6 ...

  4. MySQL高级篇知识点——其它数据库日志

    目录 1.其他数据库日志 1.1.日志类型 1.2.日志的弊端 2.慢查询日志 (slow query log) 3.通用查询日志 (general query log) 3.1.问题场景 3.2.查 ...

  5. mysql高级篇学习笔记

    目录 前言 1 mysql安装及运行(linux环境) 1.1 安装前检查 1.2 MySQL卸载 ①**关闭 mysql 服务** ②**查看当前 mysql 安装状况** ③**卸载上述命令查询出 ...

  6. MySQL高级篇知识点——索引优化与查询优化

    目录 1.数据准备 1.1.建库建表 1.2.创建相关函数 1.3.创建存储过程 1.4.调用存储过程 1.5.删除某表上的索引 2.索引失效案例 2.1.全值匹配 2.2.最佳左前缀匹配原则 2.3 ...

  7. mysql高级篇(二)mysql索引优化分析

    mysql高级篇笔记 mysql高级篇(一)mysql的安装配置.架构介绍及SQL语句的复习. mysql高级篇(二)mysql索引优化分析. mysql高级篇(三)查询截取分析(慢查询日志).主从复 ...

  8. 程序猿必备技能之MySQL高级篇

      MySQL是我们非常常用的关系型数据库,非常重要,所以在这里给大家整理下MySQL的高级内容. 1. MySQL高级特性 1.1. MySQL体系结构 Client Connectors: 接入方 ...

  9. Mysql高级(事务、索引)

    Mysql高级(锁.日志) 存储引擎 1.概述 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 .存储引擎是基于表的,而不是基于库的.所以存储引擎也可被称为表类型: Oracle,Sq ...

  10. MySQL数据库进阶系统学习6(MySQL高级-视图-事务-索引-账户管理-主从)

    第六部分: MySQL高级 详细资料参考html文件17 9.1 视图 问题 对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变, 为了保证查询出来的数据与之前相 ...

最新文章

  1. 进程间通信的几种方式
  2. python LAADS+Selenium下载MODIS数据
  3. 自己写的TimeHelper javal时间工具
  4. ubuntu16.04 TLS安装java
  5. kernel编译速度提高
  6. 项目中出现npm WARN locking errno: -4048, npm WARN locking code: ‘EPERM‘, npm WARN locking syscall:
  7. codevs 3083 二叉树
  8. c语言程序书写遵循的规则,C程序书写时应遵循的规则
  9. Service Worker概念和应用介绍
  10. react如何请求amr文件流接口-优化版
  11. ſ xf(sinx)dx 中的f(sinx)到底是什么
  12. PPT模板,背景图片,等等(千图网大礼包)
  13. Windows 10 下载
  14. 基于php+mysql的手机销售管理系统
  15. 企业IT管理岗的首选认证:ITIL®4 Foundation
  16. 常用的协议端口号(TCP and UDP)
  17. 【转载】SaaS的行业概述及发展现状
  18. pycharm 明明解释器里已经下载了sklearn,但还是显示找不到sklearn解决办法
  19. 微信Hook最佳实践-WechatHook
  20. Cisco路由器忘记密码

热门文章

  1. emc re 整改 超标_CE认证EMC测试不合格,如何整改 ;
  2. 软件测试周刊(第32期):沙漠中藏着一口井
  3. 31个惊艳的数据可视化作品,感受“数据之美”!
  4. 单片机基础教程那么多,什么样才是靠谱的学习方式
  5. ORB_SLAM2源码阅读(一)概要
  6. Spring——自动装配
  7. 【SpringBoot系列】自动装配原理
  8. F.dropout()与nn.dropout()
  9. DEMAC电机驱动型电缆卷筒—上海班品智能
  10. 首都师范 博弈论 2 2 4划线法