前言

写文不易,欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!(文末还有福利与彩蛋哦!)

1. 事务的 ACID 特性

  • Actomic,原子性:一个事务中的所有操作,要么全部完成,要么全部失败。
  • Consistency:一致性:事务执行前和执行后数据库都处于一致的状态。
  • Isolation:隔离性:同时进行中的事务不会看到其他事务的中间状态。
  • Durability,持久性:事务提交成功后,对数据库所做的变更都是持久的。

2. SQL 标准的事务隔离级别

  • 读未提交, read uncommitted:一个事务还没提交,它做的变更就能被别的事务看到。问题:会产生”脏读”,读到的数据可能是不一致的。
  • 读已提交, read committed:一个事务提交后,它做的变更才会被别的事务看到。问题:不可重复读,在一个事务里,前后两次执行同一个 SQL 看到的数据是不一致的,产生的原因有:1. 数据被修改或删除(称为”不可重复读”),2. 有新插入的数据(称为”幻读”)。
  • 可重复读, repeatable read:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。解决了”不可重复读”的问题,但没有解决”幻读”问题。
  • 串行化, serializable:对于同一行记录,“写”会加写锁,“读”会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。解决了”幻读”的问题,但效率低。

3. InnoDB 里事务的实现

在 MySQL 中,事务支持是在存储引擎层实现的。支持事务的引擎主要是 InnoDB 。

InnoDB 的默认隔离级别是可重复读,但达到了 SQL 标准的串行化级别,能解决”幻读”问题。可以通过下面的命令查看隔离级别:

mysql> show variables like 'transaction_isolation';+-----------------------+-----------------+| Variable_name | Value |+-----------------------+-----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+-----------------+1 row in set, 1 warning (0.01 sec)

快照读:普通的查询是快照读,只能看到事务开始时所有已提交事务的修改。

当前读:特殊的读操作,插入/更新/删除操作,要求读到当前所有已提交的记录的最新值,属于当前读,需要加锁。用于支持事务里的 DML 语句。

select * from table where ? lock in share mode;select * from table where ? for update;insert into table values (…);update table set ? where ?;delete from table where ?;

InnoDB 通过 MVCC 机制解决了快照读的”不可重复读”问题。通过行锁和间隙锁 gap-lock 解决”幻读”问题,用行锁防止事务之间的并发更新,用间隙锁防止插入新的数据。

3.1 MVCC

MVCC 是用来解决事务的一致性读,用于支持可重复读(repeatable read)、读已提交(read commited)。

MVCC 实现:每次更新数据都会在 undo log 里新生成一条记录,记录了数据修改前的状态,该记录同时记录了事务的ID, row trx_id。

同一条记录的修改记录组成一条链,通过在链上回滚可以读出以往版本的值。这样同一条记录在系统中有多个版本,因此称为多版本并发控制。

redo/undo log 在重启之后重新生成,事务 ID 在内存中维护、分配,重启后再重新开始。

InnoDB 在事务启动时为事务记录下所有启动了但还没提交的事务 ID,记录在一个数组里。

这组事务ID的最小值记为低水位,最大值加1 记为高水位。

对数据的可见性判断规则为:

1. 小于低水位或者是本事务修改的可见;

2. trx_id 在高-低水位之间,且不在事务ID数组里的,是已提交的,可见。

不能只根据高低水位的值判断,高低水位之间的某些事务可能已提交。

InnoDB是通过在每行记录后面保存两个隐藏的列来实现的。一个保存行的创建时间,一个保存行的过期时间(或删除时间)。这个不是实际的时间值,而是系统版本号(System Version Number)。

每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的的系统版本号作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

read-view,视图,是由事务 ID 加上可见性规则来实现的,不是物理存在的。

当系统里没有比这个回滚日志更早的 read-view 的时候,就可以删除这个回滚日志。如果系统里存在长事务,在这个事务提交之前,它可能用到的回滚记录都必须保留,这会导致占用大量的存储空间。

查询持续时间超过 60 秒的事务:

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

3.2 不同隔离级别的读取实现

在实现上,数据库会创建一个视图,访问的时候以视图的逻辑结果为准。

在可重复读隔离级别下,视图在事务启动的时候创建,整个视图存在期间都使用这个视图。

在读提交隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。

读未提交隔离级别下直接返回记录上的最新值,没有视图概念。

串行化隔离级别下直接用加锁的方式来避免并行访问。

4. 两阶段提交

redo log 和 binlog 有一个共同的数据字段叫 XID 把他们关联起来。

两阶段提交:

1. 写入 redo log,处于 prepare 阶段; 时刻A2. 写入 binlog; 时刻B3. 提交事务,处于 commit 状态。

崩溃恢复时:

  • 已经有 commit 标记的直接提交;
  • 扫描 prepare 状态的 redo log,拿 XID 去 binlog 查找相应的 binlog 记录:
  • 如果没有找到,此时肯定是在时刻A崩溃,此时有 redo log,没有 binlog,则回滚这个 redo log,不恢复事务,否则主备库会不一致。
  • 如果找到了,是在时刻B崩溃,继续提交事务即可。

最后

为感谢各位粉丝的支持,帮助各位喜欢java的朋友,我整理了将近5个G大小的学习资料哦,资料包含了架构学习、面试集锦、硬核知识点解析,视频教程等。

转发+关注+私信发送《架构资料》获得领取方式!

转发+关注+私信发送《架构资料》获得领取方式!

转发+关注+私信发送《架构资料》获得领取方式!

重要的事情说三遍!

更多笔记分享

赏色

mysql view 能和表关联吗_MySQL 事务隔离及实现,赶快码上收藏!满满干货相关推荐

  1. mysql view 能和表关联吗_MySQL数分:复杂查询

    此次分享的内容是MySQL的复杂查询. 同样,我们依旧先进入提问环节:如果A九需要经常性的对学生性别对应人数进行汇总,有没有什么便捷的方法? 答案是有的.我们可以使用创建一个"按性别汇总&q ...

  2. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  3. mininet编程实现交换机规则的插入、删除与修改。_Mysql事务隔离以及MVCC实现原理...

    上一篇我们了解了mysql的几种日志,大致知道这些日志的作用,今天我们配合Mysql的事务以及事务的隔离级别进一步理解mysql如何实现事务相关的特性.其中重点理解mysql innodb的多版本控制 ...

  4. mysql 删除语句多表关联_MySQL多表关联数据同时删除sql语句

    MySQL多表关联数据同时删除sql语句 有需要的朋友可参考. DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 代码如下 1 delete from t1 wher ...

  5. mysql分库分区分表怎么做_mysql 分区、分表、分库分表。

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁 ...

  6. mysql从多个表查询数据类型_MySQL 之 多表查询

    阅读目录 一.多表联合查询 #创建部门CREATE TABLE IF NOT EXISTSdept ( didint not null auto_increment PRIMARY KEY, dnam ...

  7. mysql索引优化 - 多表关联查询优化

    1 left join EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card; LEFT JOIN条件用于确定如何从 ...

  8. mysql 默认事务隔离级别_MySQL 事务隔离级别详解

    个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 简介: MySQL的事务隔离级别一共有四个,分别是读未提交.读已提交.可重复读以及可串行化. 四个特性ACID 原子性 (Atomicity) 事 ...

  9. mysql事务实战_mysql事务隔离级别详解和实战

    A事务做了操作 没有提交 对B事务来说 就等于没做 获取的都是之前的数据 但是 在A事务中查询的话 查到的都是操作之后的数据 没有提交的数据只有自己看得到,并没有update到数据库. 查看InnoD ...

最新文章

  1. Maven 的dependency 的 classifier的作用
  2. 分段埃尔米特插值Python实现并检查误差
  3. 同步器 java_您可能不知道的五个高级Java同步器
  4. php快速删除,学习猿地-php如何快速删除文章
  5. 【TFS 2017 CI/CD系列 - 01】-- Agent篇
  6. 利用PPT要怎样制作文字弹幕特效
  7. 油猴天眼查公司链接获取(用油猴实现爬虫python版)
  8. C# 调试应用提示“无法访问此网站”问题的处理(图文)
  9. 华为云 鲲鹏ARM云服务器 和 x86云服务器 性能评测对比
  10. QImage 大小缩放
  11. 微型计算机原理与接口选择题,2010年4月全国自考(微型计算机原理与接口技术)真题试卷...
  12. 【English】新征程,我们在路上
  13. 365天挑战LeetCode1000题——Day 096 消失的两个数字 子串能表示从 1 到 N 数字的二进制串 检查数组是否存在有效划分
  14. stm32 --如何安装J-Link驱动软件
  15. nba2k18服务器暂时不可用,NBA2K18连不上服务器解决方法 连接不上服务器咋办_3DM单机...
  16. 军职在线大学计算机,军职在线电脑版
  17. 薪资16K,在阿里外包工作是一种什么体验...
  18. NE555八音电子琴
  19. 计算机速录等级考试时间,全国计算机速录等级考试三级考试大纲
  20. 大数据||Hadoop分布式部署虚拟机

热门文章

  1. AI最佳论文都在这里了!(非常全,快领!)
  2. 刷爆 AI 圈!基于 Transformer 的 DALL-E 代码刚刚开源了
  3. 吴恩达Deeplearning.ai国庆节上新:生成对抗网络(GAN)专项课程
  4. 欢迎来到美多商城!-项目准备之项目介绍-项目需求分析-项目架构设计
  5. python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
  6. 汇编语言 第3版 王爽 检测点习题部分—答案及详细解析
  7. SLAM 技术之对于扫描精度的影响及改进
  8. 双目视觉测距原理,数学推导及三维重建资源
  9. 10个例子带你了解机器学习中的线性代数
  10. 使用深度学习从视频中估计车辆的速度