mysql 不同连接的事务 会嵌套_MySQL——事务
事务(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实现方式
通过在每行记录后面保存在两个隐藏的列来实现:
- 保存行的创建时间
- 保存行的过期时间(或删除时间)
注:存的不是实际的时间值,而是系统版本号
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——事务相关推荐
- mysql 事务隔离规范_MySQL事务隔离级别以及脏读、幻读、不可重复读示例
事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...
- mysql事务排队情况_MySQL事务问题
并发事务问题 每个客户端和服务器的一次连接,就是一个会话,而每个客户端可以在自己的会话中发出事务请求,一般来说一个服务器可以连接若干个客户端,所以一个服务器可以同时处理很多事务请求,但理论上某个事务在 ...
- mysql里hdr是什么的缩写_MySQL事务之-2
在上一篇中我们提到了MySQL的事务特性,这一片主要讲述事务的实现. 事务的隔离性由锁来实现.原子性,一致性,持久性通过数据库的redo和undo log来实现. redo恢复提交事务修改页的操作,而 ...
- mysql view 能和表关联吗_MySQL 事务隔离及实现,赶快码上收藏!满满干货
前言 写文不易,欢迎大家一起交流,喜欢文章记得关注我点个赞哟,感谢支持!(文末还有福利与彩蛋哦!) 1. 事务的 ACID 特性 Actomic,原子性:一个事务中的所有操作,要么全部完成,要么全部失 ...
- mysql事务实现数据更新_MySql事务select for update及数据的一致性处理讲解
MySQL中的事务,默认是自动提交的,即autocommit = 1: 但是这样的话,在某些情形中就会出现问题:比如: 如果你想一次性插入了1000条数据,mysql会commit1000次的, 如果 ...
- mysql 默认事务隔离级别_MySQL 事务隔离级别详解
个人公众号『码农札记』,欢迎关注,查看更多精彩文章. 简介: MySQL的事务隔离级别一共有四个,分别是读未提交.读已提交.可重复读以及可串行化. 四个特性ACID 原子性 (Atomicity) 事 ...
- mysql事务使用转化_Mysql事务
1事务简介 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操 ...
- mysql大事务commit快_MYSQL事务他快你慢,都是你自己惹的祸
实际事务DB里面常见的东西,没有事务的DB 那就不是DB ,但同样完成一个功能,并且书写也相似的存储过程逻辑(事务),怎么就快慢不一. 下面就来一个例子开刀, 下面是两个存储过程,往一个表里面插入10 ...
- mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解
一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...
最新文章
- MariaDB Window Functions窗口函数分组取TOP N记录
- 关于自定义的登录机制在SAP Spartacus服务器端渲染(SSR)实施过程中遇到的问题
- java基础之XML
- [AX]AX2012 SSRS报表使用Report Data Method
- oracle11g的tnstimeout,redhat下oracle11g 配置listener.ora
- mysql定时任务 分钟_mysql定时任务
- 日留存、周留存、月留存,究竟怎样才能让更多的用户留下来?
- 一周二次课(12月12日)
- 项目cookie优化之cookie数量限制和多页面共享污染数据问题
- [译]Java 设计模式之组合
- 数字电路的基础知识(结合Verilog)
- 惠普m1216硒鼓清零步骤_显示耗材余量错误怎么解决呢,一招搞定
- 求逆元模版 (Java版)
- WTL入门(五) 自定义控件
- 02-03-JSP-Maven-会话-MySQL事务
- Modifier private is redundant for enum constructor
- 【2022年二级Python】②基本数据类型
- HAL学习笔记-3 HAL库介绍
- 大数据应用实践2: IMDG应用场景
- (ROC-RK3568-PC) 裸机23_驱动VOP2显示彩条画面
热门文章
- 1.2-puppet安装准备工作
- iOS网络开发(8)文件下载的实现
- WEB免费打印控件推荐
- Android 移植到 C#
- Microsoft Dynamics CRM4.0 Data Auditing and Restore (数据审核和恢复)
- 记住,永远不要在MySQL中使用“utf8”
- 在echarts中自定义提示框内容
- Android中文API(127) —— MessageQueue
- 重构第28 天 重命名bool方法(Rename boolean method)
- C#如何把List of Object转换成List of T具体类型