mysql8.0事务学习

1、基本概念

事务(Transaction)是访问和更新数据库的程序执行单元;是一个最小的不可分割的工作单元,能保证一个业务的完整性;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。事务只和DML语句有关,或者说只有DML语句才有事务,如果业务逻辑不同,DML语句的个数也不同。在MySQL中,默认情况下事务是自动提交的。

DML(data manipulation language)数据操纵语言:就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。
DDL(data definition language)数据库定义语言:其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作。
DCL(Data Control Language)数据库控制语言:是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。

2、 提交和回滚

提交和回滚针对的是dml语句,ddl语句会直接提交事务。典型的MySQL事务是如下操作的

start transaction;
…… #一条或多条sql语句
commit;

其中start transaction标识事务开始,commit提交事务,将执行结果写入到数据库。如果sql语句执行出现问题,会调用rollback,回滚所有已经执行成功的sql语句。当然,也可以在事务中直接使用rollback语句进行回滚。

自动提交:MySQL中默认采用的是自动提交(autocommit)模式,如果没有start transaction显式地开始一个事务,那么每个sql语句都会被当做一个事务执行提交操作。如下所示:

=

autocommit参数是针对连接的,在一个连接中修改了参数,不会对其他连接产生影响。
关闭autocommit:如果关闭了autocommit,则所有的sql语句都在一个事务中,直到执行了commit或rollback

3、ACID是衡量事务的四个特性

原子性(Atomicity):语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的;实现主要基于undo log,记录事务之前原始的数据,
一致性(Consistency):保证事务提交后不会因为宕机等原因导致数据丢失,即数据库的完整性约束没有被破坏 ;实现主要基于redo log,记录事务修改后数据。
隔离性(Isolation):保证事务和事务之间是相互分离,互不影响;InnoDB默认的隔离级别是RR(可重复读),RR的实现主要基于锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于undo log的版本链、ReadView)
持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚,MySQL 事务的持久性主要基于redo log。

4、事务的并发问题

脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读:就好像发生了幻觉一样,比如:明明当前事务查询没有这条结果,理应可以在当前事务进行新增操作,但是却提示记录已存在不能插入相同主键记录,这就是幻读,或者修改明明是全表update,但是执行成功后再进行查询却发现还有一条记录没有更新成功,这也是幻读。
其中:
不可重复读的和幻读区别:不可重复读侧重于修改或删除,幻读侧重于新增。不可重复读是select同一个数据发现的到的结果跟刚才不一样。幻读是比不可重复读高一个级别的错误,读取同一条数据发现跟刚才是一样的,只有读取一堆数据发现忽然多了一个,或者少了一个,就像自己产生了幻觉!综上,不可重复读针对的是同一条数据,幻读针对的是一片数据。
解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

5、锁

悲观锁:假定所有不同事务的处理一定会出现干扰,数据库中最严格的并发控制策略,如果一个事务正在对数据处理,那么在整个事务过程中,其他事务都无法对这个数据进行更新操作,直到该事务释放了这个锁。
乐观锁:假定所有不同事务的处理不一定会出现干扰,所以在大部分操作里不许加锁,但是既然是并发就有出现干扰的可能。在乐观锁中当提交更新请求之前,要先去检查读取这个数据之后该数据是否发生了变化,如果有变化,那么你此次的提交就要放弃,如果没有变化就可以提交。

6、事务隔离级别

事务隔离级别 名称 脏读 不可重复读 幻读
read-uncommitted 读未提交
read-committed 读已提交
repeatable-read 可重复读
serializable 串行化
 mysql默认隔离级别是“可重复读”,oracle默认隔离级别是“读已提交”。隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
可重复读 隔离级别表示, 你随便读,读多少次都没事,是好的一面。
MySQL InnoDB的mvcc机制解决不可重复读,并不保证完全避免幻读,需要应用使用加锁读来保证,mvcc属于乐观锁。
参考https://blog.csdn.net/qq_35590091/article/details/107734005

我的理解:1、事务的并发问题都是数据库读一致性的问题。2、回滚导致脏读,读已提交解决。3、不可重复读针对同一数据修改,锁行解决。4、幻读是查询和dml操作有间隙导致,锁表解决

7、事务提交过程

MySQL是通过WAL(Write-Ahead Logging)方式,来保证数据库事务的一致性和持久性

WAL是一种实现事务日志的标准方法,具体而言就是:
1、修改记录前,一定要先写日志;
2、事务提交过程中,一定要保证日志先落盘,才能算事务提交完成。
通过WAL方式,在保证事务特性的情况下,可以提高数据库的性能。

MySQL 本身不提供事务支持,而是开放了存储引擎接口,由具体的存储引擎来实现,具体来说支持 MySQL 事务的存储引擎就是 InnoDB。存储引擎实现事务的通用方式是基于 redo log 和 undo log。简单来说,redo log 记录事务修改后的数据, undo log 记录事务前的原始数据。在 MySQL 执行事务过程中如果因故障中断,可以通过 redo log 来重做事务或通过 undo log 来回滚,确保了数据的一致性。这些都是由事务性存储引擎来完成的,但 binlog 不在事务存储引擎范围内,而是由 MySQL Server 来记录的。

事务执行过程简化如下:

  1. 先记录 undo/redo log,确保日志刷到磁盘上持久存储。
  2. 更新数据记录,缓存操作并异步刷盘。
  3. 将事务日志持久化到 binlog。
  4. 提交事务,在 redo log 中写入commit记录。

这样的话,只要 binlog 没写成功,整个事务是需要回滚的,而 binlog 写成功后即使 MySQL Crash 了都可以恢复事务并完成提交。要做到这点,就需要把 binlog 和事务关联起来,而只有保证了 binlog 和事务数据的一致性,才能保证主从数据的一致性。所以 binlog 的写入过程不得不嵌入到纯粹的事务存储引擎执行过程中,并以内部分布式事务(xa 事务)的方式完成两阶段提交

MySQL8.0事务知识点的更多相关文章

  1. MySQL8.0 原子DDL

    Edit MySQL8.0 原子DDL 简介 MySQL8.0 开始支持原子 DDL(atomic DDL),数据字典的更新,存储引擎操作,写二进制日志结合成了一个事务.在没有原子DDL之前,DROP ...

  2. 深入解读MySQL8.0 新特性 :Crash Safe DDL

    前言 在MySQL8.0之前的版本中,由于架构的原因,mysql在server层使用统一的frm文件来存储表元数据信息,这个信息能够被不同的存储引擎识别.而实际上innodb本身也存储有元数据信息.这 ...

  3. MySQL8.0.19主从环境搭建(CentOS7)

    默认情况下,复制是异步的,从站不需要永久连接以接收来自主站的更新.根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表. MySQL中复制的优点包括: 横向扩展解决方案 - 在多个从站之间 ...

  4. Centos7安装MySQL8.0 - 操作手册

    MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一.  Mysql8.0版本相比之前版本的一些特性 1) ...

  5. mysql8.0发布新特性

    2018年4月21日 14:36:42 https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html#mysqld-8-0-11-b ...

  6. linux 中安装mysql8.0

    转载自:http://www.linuxidc.com/Linux/2016-11/137608.htm 可能有人会惊奇MySQL为何从5.x一下跳跃到了8.0.事实上,MySQL 5.x系列已经延续 ...

  7. mysql8.0的新特性

    https://www.cnblogs.com/kevingrace/p/10482469.html MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 ...

  8. CentOS7安装MySQL8.0小计

    之前讲配置文件和权限的时候有很多MySQL8的知识,有同志说安装不太一样,希望发个文,我这边简单演示一下 1.环境安装 下载MySQL提供的CentOS7的yum源 官方文档:<https:// ...

  9. MySQL-08 MySQL8.0新特性

    性能 MySQL 8.0 在一定的用户访问条件下,速度要比 MySQL 5.7 快 2 倍.MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载.IO 密集型工作负载.以及高竞争(" ...

  10. MySQL8.0 redo日志系统优化

    背景 现在主流的数据库系统的故障恢复逻辑都是基于经典的ARIES协议,也就是基于undo日志+redo日志的来进行故障恢复.redo日志是物理日志,一般采用WAL(Write-Ahead-Loggin ...

随机推荐

  1. Java实时多任务调度过程中的安全监控设计

    方浩波 (fanghb@eastcom.com)东方通信网络研究所 简介: 在一系列关联的多任务的实时环境中,如果有一个任务发生失败,可能导致所有任务产生连锁反应,从而造成调度失控的局面.特别是对于核 ...

  2. MySQL底层概述—1.InnoDB内存结构

    大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer 1.I ...

  3. 【解决方案】Error running,Command line is too long

    一.现象 IDEA 提示 Error running,Command line is too long 二.原因 Java 命令行启动举例如下图,当命令行字符过多的时候,就会出现 Error runn ...

  4. 编译器-FIRST集合

      语法分析器的两个重要函数 FIRST和FOLLOW FIRST的定义 FIRST(α),可从α推导得到的串的首符号的集合 1.如果X是一个终结符,那么FIRST(X) = X 2.如果X是一个非终 ...

  5. 【Amadeus原创】SQL Server查询某数据库所有表名行数和空间占用率

    ` select object_name(id) tablename, 8reserved/1024 reserved, rtrim(8dpages)+'kb' used, 8(reserved-dp ...

  6. 各种各样的 Host Builder

    各种各样的 Host Buider If you're building for the web or writing a distributed application, you might nee ...

  7. 【人工智能】深度学习框架值TF入门-模型保存与加载

    资料:https://tensorflow.google.cn/tutorials/keras/save_and_load#选项 Keras的方式 Keras版本模型保存与加载 函数 保存模型权重:m ...

  8. springboot连接mysql报错errorCode 0, state 08S01

    前言许久未维护的项目需要检查一些数据,重新运行项目发现有create connection SQLException ,具体报错信息是 errorCode 0, state 08S01 . Sprin ...

  9. Chaincode installation on peer0.org1 has failed

    v1.4 版本执行 ./byfn.sh up时,报如下错误 Error: error getting chaincode deployment spec for mycc: error getting ...

  10. Linux 下挂载群晖 NAS 硬盘拓展空间(NFS)

    在群晖 NAS 上配置 开启 NFS 服务 打开群晖的 设置 - 文件服务 - NFS,把 NFS 服务勾选上,协议选最新即可. 配置文件夹的 NFS 权限 在 设置 - 共享文件夹 下,选择需要开启 ...