mysql事务所_mysql事务

1.事务的ACID属性

事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行

一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。

隔离性(insulation),由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。

持久性(Duration),事务完成之后,它对于系统的影响是永久性的。

2.mysql更新丢失

a.第一类丢失更新(lost update): 在完全未隔离事务的情况下,两个事物更新同一条数据资源,某一事物异常终止,回滚造成第一个完成的更新也同时丢失。

b.第二类丢失更新(second lost updates):是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。

c.脏读(dirty read):如果第二个事务查询到第一个事务还未提交的更新数据,形成脏读。

d.幻读(phantom read):一个事务执行两次查询,第二次结果集包含第一次中没有或者某些行已被删除,造成两次结果不一致,只是另一个事务在这两次查询中间插入或者删除了数据造成的。

e.不可重复读(unrepeated read):一个事务两次读取同一行数据,结果得到不同状态结果,如中间正好另一个事务更新了该数据,两次结果相异,不可信任。

3.事务的四种隔离等级,按照安全性由高到低分别为

a. Serializable 串行化

b. Repeatable Read 可重复读

c. Read Commited 可读已提交

d. Read Uncommited 可读未提交

隔离级别脏读不可重复读幻读第一类丢失更新第二类丢失更新

READ UNCOMMITED

允许

允许

允许

不允许

允许

READ COMMITTED

不允许

允许

允许

不允许

允许

REPEATABLE READ

不允许

不允许

允许

不允许

不允许

SERIALIZABLE

不允许

不允许

不允许

不允许

不允许

4.悲观锁和乐观锁

a.悲观锁:大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。

b.乐观锁:为了避免悲观锁的性能问题,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个"version"字段来实现。

乐观锁的工作原理:读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

5.innodb事务特性

a.innodb能检测到死锁,可能返回错误,也可能将持有最少行级排他锁的事务进行回滚

b.innodb存储引擎在修改表数据时,使用事务日志,用追加的方式保存修改记录,将随机IO方式改为了顺序IO方式,提高处理速度、

c.事务默认采用自动提交,如果不是显示开始一个事务,则每个查询都被当做一个事务执行提交操作

6.InnoDB的事务隔离等级以及如何解决幻读:

innodb引擎默认使用REPEATABLE READ(可重复读)隔离级别。该隔离级别还是会产生幻读问题。还

需要使用next-key locking技术启动事务来避免幻读。

具体实现是:事务A针对非唯一索引查询时,会使用排它锁 锁住索引前后两个范围,其他事务无法在此范围内写入数据,这样事务A多次查询的记录数都是一样的

7.InnoDB存储引擎MVCC的实现策略:

MVCC将数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能.

MVCC实现原理:MVCC保存某个时间点上的数据快照。一个事务内,看到的是同一个版本的快照,数据一致。不同事务在同一时间点看到的数据会不一致,因为他们得到的数据版本不一样。InnoDB在每行记录存在额外的隐藏字段,其中一列存储行被更新的版本号,另外一列存储行被删除的版本号。每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号,所以版本号也可以被认为是事务号.对于每一个”查询”语句,innodb都会把这个查询语句的版本号同这个查询语句遇到的行的版本号进行对比,然后结合不同的事务隔离等级,来决定是否返回该行。当隔离级别是REPEATABLE READ时,这种策略下,select、delete、 insert、 update语句如何操作:

1) SELECT:如果要查询的行被行锁锁定,为了提高效率会去读取undo日志,提高了效率。如果没有锁定呢?根据条件查询出结果并过滤掉deleteVersion早于当前事务的行?

2) INSERT: 对新插入的行,行的更新版本被修改为该事务的事务号

3) DELETE:对于删除,innodb直接把该行的被删除版本号设置为当前的事务号,相当于标记为删除,而不是实际删除。innodb有一定规则来触发真正的删除操作

4) UPDATE:在更新行的时候,innodb会把原来的行复制一份到undo段中,并把当前的事务号作为该行的创建版本?(undo日志到底存的什么?)

在每一行数据中额外保存两个隐藏字段:当前行创建时的版本号和删除时的版本号(可能为空)。每个事务又有自己的版本号,这样事务内执行CRUD操作时,就通过版本号的比较来达到数据版本控制的目的。具体做法见下面的示意图。

7910059.html

MVCC缺点:为了实现多版本,InnoDB需要维护额外的隐藏字段,以及清理不需要的行版本,带来额外开销。

c1ff5c9d4723e345d22d947d0952bca7.png

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

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

相关文章

[草稿]挂载新硬盘

查看新硬盘&创建分区 xxxxxx:/dev$ sudo fdisk -l [sudo] password for xxx: Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders, total 167772160 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/physical):…

php mysql 迁移_将phpstudy中的mysql迁移至Linux教程

项目目的将原来windows环境中使用phpstudy搭建的mysql 5.5.53 中的数据迁移至新主机Linux环境中环境情况新主机系统平台:CentOS release 7.4 (Final) 内核 3.10.0-693.el7.x86_64mysql环境:mysql> statusServer version: 5.6.39-log…

Swift 操作符

这里只记录一些swift特殊的运算符 1.swift里面 仅仅进行赋值操作,不再向右边返回左值 2.模运算的操作数可以是小数了 3.Nil Coalescing Operator nil coalescing operator用来判断一个可选值是否有值,如果没有的话就赋予其一个缺省值 注意这里面“&…

python json.dumps慢_python json.dumps中文乱码问题解决

json.dumps(var,ensure_asciiFalse)并不能解决中文乱码的问题json.dumps在不同版本的Python下会有不同的表现, 注意下面提到的中文乱码问题在Python3版本中不存在。注:下面的代码再python 2.7版本下测试通过# -*- coding: utf-8 -*-odata {a : 你好}print odata结果…

UIView常见方法总结

一、随机生成数 1. arc4random() 会生成任意正整数和0 2. arc4random_uniform(100) 会生成0~99的整数 (包括0和99) 二、UIView常见方法 1. addSubview:(UIView *)child 添加子控件用(最新添加的子控件,会显示在最上面)…

netty java_Netty框架学习及第一个Netty应用

编辑推荐:本文来自于csdn,文章主要介绍了Netty的基础,有什么特点,其构成部分是什么,以及相关的应用。1.什么是Netty?Netty是一个利用Java的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的API的客户端/服务器框…

兩端對齊

1.利用flex parentElement{display: flex;justify-content: space-between;} 左边对齐右边对齐<div class"justifySpan"><span>齐</span><span>齐</span></div> .justify {display: -webkit-box;display: -ms-flexbox;display: …

java拆装_Java自动拆装包

Java自动拆装包的例子这段代码在Java 1.5以前是不合法的Long v 0&#xff1b;v 1&#xff1b;需要写成这样&#xff1a;Long v 0&#xff1b;v new Long(1);在Java 1.5 以后&#xff0c;编译器帮我们做了上面的工作。这就是Java的自动拆装包&#xff0c;方便了很多&#xf…

Android学习(二十)Notification通知栏

一、通知栏的内容 1、图标 2、标题 3、内容 4、时间 5、点击后的相应 二、如何实现通知栏 1、获取NotificationManager。 2、显示通知栏&#xff1a;notify(id,notification); 3、取消通知栏&#xff1a;cancle(id); 4、构造Notification并设置显示内容; 5、通知栏通知可以设置…

java访问mongodb_Java中获取MongoDB连接的方法详解

首先是所需jar包&#xff0c;Maven中的配置如下&#xff1a;org.mongodbmongodb-driver3.4.1org.mongodbbson3.4.1org.springframework.dataspring-data-mongodb1.7.0.RELEASEorg.mongodbmongo-java-driver3.9.1获取连接的代码如下(本中用的是模板类)&#xff1a;List addrs n…

@jsonignore的作用

作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 如下&#xff1a; package com.hzboy.orm;import java.util.List;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.per…

java between_Java8 Period.between方法坑及注意事项

在使用Java8 新特性中关于Period.between的方法时需注意该方法获取日期的区间问题。Testpublic void test1(){LocalDate from LocalDate.of(2018,10,1);System.out.println(Period.between(from,LocalDate.now()).getDays());}首先&#xff0c;猜测一下上面的代码返回的天数是…

IT英语2-编程词汇编程英语词汇

IT英语2-编程词汇编程英语词汇 A2A integration A2A整合 abstract 抽象的 abstract base class (ABC)抽象基类 abstract class 抽象类 abstraction 抽象、抽象物、抽象性 access 存取、访问 access level访问级别 access function 访问函数 account 账户 action 动作 activate …

webdriver 爬虫 java_java爬虫通过selenium+WebDriver遍历页面链接报错

背景由于要爬取的页面&#xff0c;每个链接的请求都是点击之后js动态发起的&#xff0c;目标数据也多是js动态生成的&#xff0c;所以使用selenium工具webdriver(调试用的是chrome&#xff0c;具体使用准备用phantomjs).模拟登录之后&#xff0c;模拟查询之后&#xff0c;得到如…

java删除集合元素吗_java如何删除集合中的元素

java如何删除集合中的元素如何使用java删除集合中的元素呢?下面是小编给大家提供的删除集合中元素的常见方法&#xff0c;欢迎阅读&#xff0c;更多详情请关注应届毕业生考试网。Java代码如下&#xff1a;package com.jerval.test;import java.util.ArrayList;import java.uti…

XmlDocument类

XmlDocument类是.NET框架的DOC解析器。XmlDocument将XML视为树状结构&#xff0c;它装载XML文档&#xff0c;并在内存中构建该文档的树状结构。下面来看下XmlDocument提供了哪些功能。 一、属性&#xff1a; Attributes      获取一个 XmlAttributeCollection&#xff0c…

java gc回收算法_Java GC回收算法-判定一个对象是否可以回收

开源推荐推荐一款一站式性能监控工具(开源项目)Pepper-Metrics是跟一位同事一起开发的开源组件&#xff0c;主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dubbo/servlet)集成&#xff0c;收集并计算metrics&#xff0c;并支持输出到日志及转换成多种时序数…

动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

1、问题描述 给定一个字符串&#xff08;序列&#xff09;&#xff0c;求该序列的最长的回文子序列。 2、分析 需要理解的几个概念&#xff1a; ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblog/p/4321398.html这一篇文章描述了利用动态规划求解两个序列的最长公共…

java类作用域标识符_java入门 (二) 标识符、数据类型、类型转换、变量、常量、作用域...

java入门(二)标识符数据类型类型转换变量、常量、作用域本次笔记引用B站&#xff1a;狂神说,虽然早就会了&#xff0c;现在回头来敲下基础&#xff0c;加深印象1.标识符&#xff1a;java所有的组成部分都需要名字。类名丶变量名丶方法名统称为标识符。标识符大小写敏感。不能使…

0421 AutoLayout的实践/基本使用

历史:从iOS 6开始 ,之前都是3.5英寸没有考虑到适配.iPhone5 变成了4英寸,所以推出了Auto Layout理解: 另外一个体系,去描述位置.像素:点: // 勘误: 图中的像素应为 “点"// 写上以上代码,就可以删掉系统创建的控制器和storyBoard了.// 创建控制器,勾选Xib[]拖一个uiview背…