mysql特性举例_MySQL事务的四大特性和隔离级别

1、事务的四大特性(ACID)

#### 1.1、原子性(Atomicity)

原子性是指事务包含的一系列操作要么全部成功,要么全部回滚,不存在部分成功或者部分回滚,是一个不可分割的操作整体。

1.2、一致性(Consistency)

一致性是可以理解为事务对数据完整性约束的遵循,这些约束可能包括主键约束、唯一索引约束、外键约束等等。事务执行前后,数据都是合法的状态,不会违背任何的数据完整性

就拿转账来说,A和B加起来有5000块钱,不管A和B如何转账,转几次账,A和B加起来的钱永远都是5000块。

总之,可以理解为:一致性是为了保证数据的完整性。

1.3、隔离性(Isolation)

隔离性是指当多个用户并发操作数据库,比如操作同一张表,数据库为每一个用户开启的事务,不能被其他的事务所干扰或者影响,事务之间是彼此独立的。

1.4、永久性(Durability)

永久性是指一个事务一旦提交了,那么对数据库中数据的改变就是永久的,即使是在数据库发生故障时,也不会丢失事务提交的数据。

2、事务的隔离性

事务的隔离性。当多个线程开启事务操作数据库中的数据时,数据库要能进行隔离操作,以保证各个线程获取数据的准确性;

如果不考虑事务的隔离性,会发生以下几个问题;

2.1、脏读

脏读是指一个事务在处理过程中读取了另一个事务未提交的数据。比如,A向B转账

update account set money = money + 100 where name = 'B';

update account set money = money - 100 where name = 'A'

当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),

而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转

2.2、不可重复读

不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发生了不可重复读。

不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……

2.3、幻读

幻读是事务非独立执行时发生的一种现象。

例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)

3、MySQL的隔离级别

> * Serializable (串行化):可避免脏读、不可重复读、幻读的发生

> * Repeatable read (可重复读):可避免脏读、不可重复读的发生

> * Read committed (读已提交):可避免脏读的发生

> * Read uncommitted (读未提交):最低级别,任何情况都无法保证

以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。

像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待)

所以平时选用何种隔离级别应该根据实际情况。

3.1、MySQL和Oracle隔离级别的对比

MySQL支持以上4种隔离级别,默认的隔离级别是Repeatable read (可重复读)

Oracle只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,默认的隔离级别是Read committed (读已提交)

查看mysql事务的隔离级别

select @@tx_isolation

4、举例说明事务的隔离级别

#### 4.1、Repeatable read (可重复读)

开启两个事务A、B,分别对同一个表中的数据进行操作,操作流程如下:

结果:在Repeatable read的隔离级别下,T4得到的结果仍然是Tom:

此时,如果将事务A提交之后,再查询,得到的将是最新的结果:

4.2、Read committed (读已提交)

现在看看将隔离级别设置为读已提交,返回的结果又是什么

set session transaction isolation level read committed

注意:此种修改只对当前会话有效,如果要全局修改隔离级别,需要到mysql安装目录下的my.ini最后添加transaction-isolation = REPEATABLE-READ

结果:在Read committed的隔离级别下,T4得到的结果就是最新,说明读到了已提交的:

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

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

相关文章

IdentityServer4密码模式

Oatuth2协议的密码模式介绍用户会将用户名,密码给予客户端,但是客户端不保存此信息,客户端带着用户的密码请求认证服务器,认证服务器密码验证通过后后将token返回给客户端。 这里借用下阮一峰老师画的图(博客地址》htt…

IKVM 编程武林之.NET派的北冥神功

为什么80%的码农都做不了架构师?>>> 在编程武林中,Java派成立较久底子雄厚,虽然掌门人Sun已经老态龙钟,镇山之技的Java语言已经被后进的新秀.NET派的C#压得喘不过气来,甚至有时候Sun老大还得跑到.NET派潜伏…

php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID

关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html在这篇微信公众平台开发教程中,我们将介绍如何在自定义菜单中获得用户的OpenID。本篇开发教程的实质是微信自定义菜…

mysql优化的重要参数 key_buffer_size table_cache

MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢?对于使用Myisam存储引擎来说,主要有key_buffer_size和…

上海大华条码称代码_上海大华计价电子秤 使用软件 TM-H 大华条码称设置15KG

电子秤上海,电子秤价格,电子秤上海牌子好 电子秤有哪些电子秤那个牌子好,产品质量好大华电子秤软件下载,大华电子秤设置,大华电子秤软件郑重声明:本店所售大华条码秤,属于上海大华的正品&#x…

代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton

据说「软件工程师」这个名词就是她发明的玛格丽特站在阿波罗计算机指导手册 (AGC) 的源代码程序列表旁边,这些材料摞起来比她的人还要高。图片来源:Margaret Hamilton缔造传奇的人似乎有个共性:本来没想干一票大的,甚至她的打算都…

如何在 ASP.Net Core 中使用 NCache

虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式。内存缓存分布式缓存Response缓存Alachisoft 公司提供了一个开源项目 NCache,它是一个高性能的,分布式的,可扩展的缓存框架,NCache不仅比 Redis 快…

oracle 动态游标行数,oracle动态游标的简单实现方法

下面就是例子程序--明细表打印予处理 通用报表:procedure mx_print_common(pd_id in mx_pd_syn.pd_id%type,p_pd_mxb_id IN mx_pd_mxb_syn.p_mxb_id%type,p_dept_no IN sc_mxk.dept_code%type,p1 sc_bz_syn.bz_code%type,p2 sc_cjjc_syn.cjjc_code%type,p3 sc_mxk.…

每扇区2048字节的U盘乱码的数据恢复

每扇区2048字节的U盘乱码的数据恢复一个U盘,FAT32分区,显示的是乱码,远程看对方的U盘参数,发现一个比较怪的现象:每扇区字节数是2048字节(U盘量产时可能是以光盘形式形成的),对方传的…

为什么有些大公司的效率弱爆了?

阅读本文大概需要5分钟。上周写了篇文章:为什么有些大公司的技术弱爆了?不少朋友读完后表示有同感,还有一些朋友在读者群探讨大公司效率问题。有几个朋友谈到自己的公司效率低下,做一件事需要层层审批,并且遇到各种阻力…

2018年最有前景的十大行业

我们想和大家分享的是围绕十个行业、数十个细分领域,在2018年发展趋势展望:01 消费新零售——平台级近半年,新零售已被多次提及。但在年终盘点我们再次提到这个“热词”,是因为该领域未来还将出现超级平台级的公司。新零售未来更多…

oracle 监听 无法连接,解决ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务...

你还有可能是遇到了定时的问题。如果监听器被重新启动,那么数据库实例就必须向它重新注册。通常情况下,每60秒就会出现这样的问题。如果你迫不及待,那么就以数据库管理员的身份登录到数据库服务器,并且运行“更改系统注册器”&…

下列选项中 采用边界值平滑_数据挖掘期末考题(答案).doc

华南理工大学计算机科学与工程学院2012—2013学年度第二学期期末考试《数据仓库与数据挖掘技术》试 卷(假的)专业:计算机科学与技术 年级:2010 姓名: 学号:注意事项:1. 本试卷共四大题,满分100分&#xff0…

昨日搬至办公室的书籍

由于家里地方小,总有一部分书籍需要跟着我辗转至各公司。其中一些公司只能让我放抽屉(地方小)甚至地板上,而有一些公司就能让我把书都摞桌子上。昨天下午我特地来了一次办公室,只为搬运书籍。灭霍霍,可真是…

如何在 ASP.Net Core 中对接 WCF

在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三方服务采用的是基于SOAP协议的场景,在这篇文章中,我们将会讨论如何…

什么是区块链? 区块链的入门教程~

区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。下面,我就来尝试,…

linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?

原标题:win10如何直接使用命令提示符提高管理员权限?在使用普通的命令提示符时,如果遇到需要管理员权限的操作,往往需要重新打开一个具有管理员权限的命令提示符页面进行操作。而在Linux操作系统中,可以通过输入su来获取系统最高…

require引入js vue_请教 关于使用require 引入vue 和公共js的问题

移动端布局 计算font-size的1、引入公共样式失败。没有去计算2、aa 是vue 引入成功。 但是 我以后一个文件需要一个vue 文件 应该怎么引入好点啊。 怎么分解开进行引入?3、在vue的情况下。 引入Mint UI我理解是在main的文件里面加载vue Mint ui 和一些公共样式。 在页面引入ma…

探索 .NET Core 依赖注入的 IServiceProvider

在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptors,然后添加到集合中。探索 .NET Core 依赖注入的 IServiceCollection[1]在本文中,我们会学习 IS…

《WinForm开发系列之控件篇》Item1 BackgroungWorker

cranejuan的专栏 BackgroundWorker实现原理 winfom組件---BackgroundWorker转载于:https://www.cnblogs.com/Sue_/articles/1657254.html