事务(Transaction)是数据库区别于文件系统的重要特性之一,事务会把数据库从一种一致状态转换为另一种一致状态。

关键词

  • 事务四大特性ACID
  • MySql事务隔离级别
  • MVCC多版本并发控制
    • 实现方式
    • 运行过程
    • MVCC解决了幻读?
    • InnoDB解决幻读的方式
  • 事务的分类
    • 扁平事务Flat Transactions
    • 带有保存点的扁平事务Flat Transactions with Savepoint
    • 链事务Chained Transaction
    • 嵌套事务Nested Transaction
    • 分布式事务
  • 重做日志redo log
  • undo
    • insert undo log
    • update undo log
  • group commit
  • MySQL分布式事务
    • XA事务
    • 两段式提交two-phase commit

1.事务四大特性ACID

原子性Atomicity:

一个事务必须被视为一个不可分割的最小工作单元。(要么全部做要么全部不做)

一致性Consistency:

数据库总是从一个一致性的状态转换到另外一个一致性的状态。(银行交易例子)

隔离性Isolation:

一个事务所做的修改在最终提交之前,对其他事务不可见。

持久性durability:

一旦事务提交,其所做的修改就会永久保存到数据库中。

2.MySql事务隔离级别

2.1未提交读Read uncommitted(脏读)

在B事务提交之前,A事务可以看到B事务带来的变化。(不锁定读)

2.2提交读Read committed(不可重复读)

一个事务范围内,在多次相同查询中可能看到不同的数据结果。(中间有B事务对其中数据进行了update等)

2.3可重复读Repeatable read

在同一个事务中多次读取同样记录的结果是一致的。(底层用MVCC多版本并发控制实现)(快照读)

2.4串行化Serializable

在读取的每一行数据上都加锁。(锁定读)

InnoDB进行Serializable时,每个select都会进行lock in share mode,不再支持非锁定读。

tips:幻读:A事务2次读过程中,B事务在A的查询范围里插入了一条新数据,于是A就看到了幻行。

3.MVCC多版本并发控制

InnoDB下的MVCC:

3.1实现方式

通过在每行记录后面保存在两个隐藏的列来实现:

  1. 保存行的创建时间
  2. 保存行的过期时间(或删除时间)

注:存的不是实际的时间值,而是系统版本号

3.2运行过程

SELECT:只查找版本早于当前事务版本的数据行;行的删除版本要么未定义,要么大于当前事务版本号

INSERT:保存当前系统版本号作为行版本号

DELETE:为删除的每一行保存当前系统版本号作为行删除标识

UPDATE:也就是INSERT+DELETE

3.3MVCC解决了幻读?

MVCC解决了读数据情况下的幻读,没有解决修改的操作下的幻读问题。

参考:https://juejin.im/post/5c9040e95188252d92095a9e

3.4InnoDB解决幻读的方式

利用间隙锁。间隙锁是一个在索引记录之间的间隙上的锁。

4.事务的分类

InnoDB不原生支持嵌套事务,其他都支持。

4.1扁平事务Flat Transactions

事务中最简单的一种,从开始到结束,其间的操作是原子的。

4.2带有保存点的扁平事务Flat Transactions with Savepoint

在扁平事务基础上,允许回滚到同一事务中较早的一个状态。

保存点是易失的。

4.3链事务Chained Transaction

提交事务操作和开始下一个事务操作将合并为一个原子操作。

4.4嵌套事务Nested Transaction

层次结构。由一个顶层事务(top-level transaction)控制各个层次的事务。

处在叶节点的事务是扁平事务。

任何子事务都在顶层事务提交后才提交。

树中任何一个事务的回滚会引起它的所有子事务回滚。

在嵌套事务中,不同的子事务在数据库对象上持有的锁是不同的。这意味着比带有保存点的扁平事务更好的并发性。

4.5分布式事务

在分布式环境下运行的扁平事务,相当于多个数据节点的事务合并在一起并满足ACID特性。

5.重做日志redo log

redo log是物理日志,是幂等的(幂等:执行一次的效果和执行若干次的效果等同)。它记录页的物理修改,并在事务进行过程中不断写入。

默认情况下,事务提交时,把重做日志缓冲写入重做日志文件,并调用fsync,彻底持久化;

次之,可以通过修改参数不进行fsync,只写入文件系统缓存(数据库宕机没事,操作系统宕机会丢失);

再次之,可以通过修改参数在事务提交时不强制进行写入重做日志文件操作,仅由master thread每秒进行重做日志文件的fsync操作。

重做日志的写入可以保证原子性,不需要doublewrite技术(因为重做日志块的大小和磁盘扇区一样都是512字节)

6.undo

undo存放在数据库内部的一个特殊段(segment)中,称为undo segment。undo段位于共享表空间中。

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

undo log会产生redo log,这是因为undo log也需要持久性的保护。(事务在undo log segment分配页并写入undo log的这个过程,需要写入redo log)

undo log分为两种:

6.1insert undo log

insert undo log指的是在insert操作中产生的undo log。因为insert操作的记录只对事务本身可见,对其他事务不可见,所以这个undo log可以在事务提交后直接删除,不需要进行purge操作。

6.2update undo log

update undo log指的是在delete和update操作中产生的undo log。它需要用以实现MVCC,所以不能在事务提交时就删除。提交时放入undo log链表,等待purge线程进行最后的删除。

7.group commit

每次事务提交时都进行fsync太消耗性能。可以采用group commit来进行“组提交”,一次fsync刷新多个事务的重做日志。

8.MySQL分布式事务

InnoDB提供了对XA事务的支持,通过XA事务来支持分布式事务的实现。

在使用分布式事务时,InnoDB的事务隔离级别必须设置为SERIALIZABLE。

8.1XA事务

XA事务由一个或多个资源管理器(Resource Managers)、一个事务管理器(Transaction Manager)以及一个应用程序(Application Manager)组成。

  • 资源管理器

    • 提供访问事务资源的方法。通常一个数据库就是一个资源管理器
  • 事务管理器
    • 协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。
  • 应用程序
    • 定义事务的边界,指定全局事务中的操作。

在MySQL数据库的分布式事务中,资源管理器就是MySQL数据库,事务管理器为连接MySQL服务器的客户端。

8.2两段式提交two-phase commit

分布式事务使用两段式提交的方式。

第一阶段:所有参与全局事务的节点都开始准备,告诉事务管理器它们准备好提交了。

第二阶段:事务管理器告诉资源管理器执行ROLLBACK还是COMMIT。如果任何一个节点显示不能提交,那么所有的节点都会被告知回滚。

mysql 不同连接的事务 会嵌套_MySQL——事务相关推荐

  1. mysql 事务隔离规范_MySQL事务隔离级别以及脏读、幻读、不可重复读示例

    事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...

  2. mysql事务排队情况_MySQL事务问题

    并发事务问题 每个客户端和服务器的一次连接,就是一个会话,而每个客户端可以在自己的会话中发出事务请求,一般来说一个服务器可以连接若干个客户端,所以一个服务器可以同时处理很多事务请求,但理论上某个事务在 ...

  3. mysql里hdr是什么的缩写_MySQL事务之-2

    在上一篇中我们提到了MySQL的事务特性,这一片主要讲述事务的实现. 事务的隔离性由锁来实现.原子性,一致性,持久性通过数据库的redo和undo log来实现. redo恢复提交事务修改页的操作,而 ...

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

    前言 写文不易,欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!(文末还有福利与彩蛋哦!) 1. 事务的 ACID 特性 Actomic,原子性:一个事务中的所有操作,要么全部完成,要么全部失 ...

  5. mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解

    MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...

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

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

  7. mysql事务使用转化_Mysql事务

    1事务简介 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操 ...

  8. mysql大事务commit快_MYSQL事务他快你慢,都是你自己惹的祸

    实际事务DB里面常见的东西,没有事务的DB 那就不是DB ,但同样完成一个功能,并且书写也相似的存储过程逻辑(事务),怎么就快慢不一. 下面就来一个例子开刀, 下面是两个存储过程,往一个表里面插入10 ...

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

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

最新文章

  1. MariaDB Window Functions窗口函数分组取TOP N记录
  2. 关于自定义的登录机制在SAP Spartacus服务器端渲染(SSR)实施过程中遇到的问题
  3. java基础之XML
  4. [AX]AX2012 SSRS报表使用Report Data Method
  5. oracle11g的tnstimeout,redhat下oracle11g 配置listener.ora
  6. mysql定时任务 分钟_mysql定时任务
  7. 日留存、周留存、月留存,究竟怎样才能让更多的用户留下来?
  8. 一周二次课(12月12日)
  9. 项目cookie优化之cookie数量限制和多页面共享污染数据问题
  10. [译]Java 设计模式之组合
  11. 数字电路的基础知识(结合Verilog)
  12. 惠普m1216硒鼓清零步骤_显示耗材余量错误怎么解决呢,一招搞定
  13. 求逆元模版 (Java版)
  14. WTL入门(五) 自定义控件
  15. 02-03-JSP-Maven-会话-MySQL事务
  16. Modifier private is redundant for enum constructor
  17. 【2022年二级Python】②基本数据类型
  18. HAL学习笔记-3 HAL库介绍
  19. 大数据应用实践2: IMDG应用场景
  20. (ROC-RK3568-PC) 裸机23_驱动VOP2显示彩条画面

热门文章

  1. 1.2-puppet安装准备工作
  2. iOS网络开发(8)文件下载的实现
  3. WEB免费打印控件推荐
  4. Android 移植到 C#
  5. Microsoft Dynamics CRM4.0 Data Auditing and Restore (数据审核和恢复)
  6. 记住,永远不要在MySQL中使用“utf8”
  7. 在echarts中自定义提示框内容
  8. Android中文API(127) —— MessageQueue
  9. 重构第28 天 重命名bool方法(Rename boolean method)
  10. C#如何把List of Object转换成List of T具体类型