mysql+nest+嵌套事务_MySQL——事务

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

关键词事务四大特性ACID

MySql事务隔离级别

MVCC多版本并发控制实现方式

运行过程

MVCC解决了幻读?

InnoDB解决幻读的方式

事务的分类扁平事务Flat Transactions

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

链事务Chained Transaction

嵌套事务Nested Transaction

分布式事务

重做日志redo log

undoinsert 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解决了读数据情况下的幻读,没有解决修改的操作下的幻读问题。

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。如果任何一个节点显示不能提交,那么所有的节点都会被告知回滚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈谈写程序与学英语(转载)

注: 本文的作者是宋劲杉,原文链接。 俗话说,没有金刚钻,就别揽瓷器活儿。套用到IT业,英语不行,就别做程序员。网上关于程序员学英语的文章不少,但我想谈谈我自己的看法。首先详细讨论一下为什么程序员离了英…

python 取日期_python取出所有的日期

python取出所有的日期>>> s "2020-09-09 we have a meeting">>> re.findall([0-9]{4}-[0-9]{2}-[0-9]{2},s)日期的比较2020-09-092020-09-10比较两个日期大小def compare_date(date1,date2) :#取出年,如果同一年#取出月,如…

python自动化和教程_《手把手教你》系列练习篇之2-python+ selenium自动化测试(详细教程)...

1. 简介今天我们还是继续练习练习基本功,各位小伙伴要耐住住性子,要耐得住寂寞啊,不要急躁,后面你会感谢你在前边的不断练习的。到后面也是检验你前边的学习成果的一次很好实践。本文介绍如何通过link text、partial link text、c…

JavaScript高级程序设计之函数表达式

函数表达式是JS中一个强大的特性,尤其是ES6支持Lamada表达式后,更是锦上添花。在前边的文章介绍中,曾经介绍过一种创建函数的方式,函数声明,对函数表达式也有简单介绍。这章将会对函数表达有更详细的介绍。 函数表达式…

异常在哪一层处理_WiFi速度慢,信号不稳定,除了重启路由器外,自己能怎么处理?...

前言WiFi出了故障,速度慢,信号不稳定,自己处理,除了重启路由器,也没有什么别的招了;好在这万能重启,差不多能解决一大半的小故障;那信号不好,速度慢,不稳定&a…

python输入输出代码_python基本输入输出代码示例

#!/usr/bin/env python# -*- coding: utf-8 -*-#输入与输出#str()与repr()for x in range(1, 11):print repr(x).rjust(2), repr(x*x).rjust(3),#逗号代表不换行print repr(x*x*x).rjust(4)#格式化输出for x in range(1, 11):print {0:2d} {1:3d} {2:4d}.format(x, x*x, x*x*x)…

linux运维、架构之路-HAProxy反向代理

一、HAProxy介绍 专业反向代理,支持双机热备支持虚拟主机,配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端节点出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入,基于TCP和HTTP应用的代理软件,开源免费、快速并且可靠的…

java洗牌_java语言实现简单的洗牌,发牌

packagecom.java.lei.homework;importjava.util.Arrays;importjava.util.Random;public classPokerGame {//1.创建数组,用以存储扑克牌static String[] pokers new String[54];public static voidmain(String[] args) {//2.创建牌 所有的牌赋值到array数组中pokers…

CSS3 3D transform变换

transform的坐标是需要了解的特性。 我们的rotateX,rotateY,rotateZ,和translateX,translateY等都是基于相同的坐标系来定位的。 3D的坐标如下入所示: 3D transform中有下面这三个方法: rotateX( angle )rotateY( angle )rotateZ( angle )理解了这三个方…

vba结束本次循环进行下次_VBA掌握循环结构,包你效率提高500倍

这是系列免费教程《Excel VBA:办公自动化》,还是老规矩,看看我们走到哪里了。1.认识VBA:什么是VBA?2.这些掌握了,你才敢说自己懂VBA3.VBA变量5年踩坑吐血精华总结4.VBA中重要的强制申明,谁看谁明…

CefSharp 支持MP4

效果图: 下载链接:https://share.weiyun.com/d1e249ef5c56b4d909b2124dc2dd8902 创建Wpf项目引用 如下: 第一步:创建项目引用CefSharp 第二步:将DLL拷贝到运行项目的Debug下 第三步:项目平台设置32位 第四…

python定义字典列表_Python基础语法(四)—列表、元组、字典、集合、字符串

列表基本概念列表是有序的元素集合,所有元素放在一对中括号中,用逗号隔开,没有长度限制;列表索引值以0为开始值,-1为从未尾的开始位置。列表可以使用操作符进行拼接,使用*表示重复。当列表元素增加或删除时…

ReentrantLock 分析

带着疑问去分析 ReentrantLock是如何实现锁管理的。ReentrantLock是如何实现重入的。ReentrantLock是如何实现公平锁与非公平锁。ReentantLock的公平锁为什么一般情况下性能都比公平锁查。ReentrantLock数据结构 ReentrantLock的底层是借助于AbstractQueuedSynchronizer实现的&…

v4l2 框架下如何设置分辨率_Linux下如何进行FTP设置

目录: 一、Redhat/CentOS安装vsftp软件二、Ubuntu/Debian安装vsftp软件一、Redhat/CentOS安装vsftp软件1.更新yum源yum update -y2.安装vsftpyum install vsftpd -y3.修改配置文件vi /etc/vsftpd/vsftpd.conf # 原有初始配置 local_umask022 dirmessage_enableYES x…

java ztree json_java递归实现ztree树结构数据展示

//获得zTree结构的数据(测试AuthInfo)RequestMapping("/getAuthInfoTree.action")public void getAuthInfoTree(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {System.out.println("getAuthInfoTree")…

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结

2017-2018-1 20155213 《信息安全系统设计基础》第十一周学习总结 【学习内容:第九章——虚拟存储器】 一、课本内容梳理 1.虚拟存储器 作用: 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和…

vscode弹出cmd_先看看 VS Code Extension 知识点,再写个 VS Code 扩展玩玩

TL;DR文章篇幅有点长 ,可以先收藏再看 。要是想直接看看怎么写一个扩展,直接去第二部分 ,或者直接去github看源码 。第一部分 --- Extension 知识点一、扩展的启动如何保证性能 --- 扩展激活(Extension Activation) 我…

Part5 数据的共享与保护 5.4类的友元5.5共享数据的保护

友元是C提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用…

webp转换gif_用 WebP 创建尺寸更小、细节更丰富的图片,以此来提高网站的速度...

WebP 文件格式是一种基于 RIFF(资源互换文件格式)的文档格式。WebP 是 2010 年 Google 开发的一种图片格式,它为网页上的图片提供了卓越的无损和有损压缩。网站开发者们可以使用 WebP 来创建尺寸更小、细节更丰富的图片,以此来提高网站的速度。更快的加载…

myeclipse java注释模板_Eclipse/MyEclipse Java注释模板设置详解 ---转载自百度空间

设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦。现就每一个元素逐一介绍:文件(Files)注释标签:/*** Title: ${file_name}* Package ${package_name…