众所周知MySQL从5.5.8开始,Innodb就是默认的存储引擎,Innodb最大的特点是:支持事务、支持行级锁。 既然支持事务,那么就会有处理并发事务带来的问题:更新丢失、脏读、不可重复读、幻读;相应的为了解决这四个问题, 就产生了事务隔离级别:未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable)。

事务的特性:

原子性:指处于同一个事务中的多条语句是不可分割的。即它对数据库的修改要么全部执行,要么全部不执行

一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。

隔离性:指多线程环境下,一个线程中的事务不能被其他线程中的事务打扰 持久性:事务一旦提交,就应该被永久保存起来。

持久性:事务一旦提交,就应该被永久保存起来。

1、概念说明:

更新丢失:最后的更新覆盖了其他事务之前的更新,而事务之间并不知道,发生更新丢失。更新丢失,可以完全避免,应用对访问的数据加锁即可。

脏读(针对未提交的数据):一个事务在更新一条记录,未提交前,第二个事务读到了第一个事务更新后的记录,那么第二个事务就读到了脏数据,会产生对第一个未提交 数据的依赖。一旦第一个事务回滚,那么第二个事务读到的数据,将是错误的脏数据。

不可重复读(读取数据本身的对比):一个事务在读取某些数据后的一段时间后,再次读取这个数据,发现其读取出来的数据内容已经发生了改变,就是不可重复读。

幻读(读取结果集条数的对比):一个事务按相同的查询条件查询之前检索过的数据,确发现检索出来的结果集条数变多或者减少(由其他事务插入、删除的),类似产生幻觉。

2、事务隔离级别:

并发处理带来的问题中,更新丢失可以完全避免,由应用对数据加锁即可。脏读、不可重读度、幻读,其实都是数据库的一致性问题,必须由一定的事务隔离机制来解决。 其中一种方法是:不用加锁,通过一定的机制生成一个数据请求时间点的一致性快照,并用这个快照来提供一个界别的一致性读取。从用户的角度看,好像是数据库提偶拱了 统一数据的多个版本。这种技术叫做:数据库多版本并发控制,MVCC 多版本数据库。

事务隔离的本质是使事务在一定程度上串行化执行,显然和并发机制是矛盾的。数据库的事务隔离越严格,并发负作用越小,代价越高(影响并发访问了呗)。

为了解决隔离和并大的矛盾,IOS SQL92规定了4个隔离级别。(隔离==串行)

大多数数据库默认的事务隔离级别是 Read Committed,比如 SQL Server , Oracle。但 MySQL 的默认隔离级别是 Repeatable Read。

举例1:

脏读(Read Uncommitted)

通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。(你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。)

举例(事务B未提交,事务A却读到了事务B未提交的数据):

3.2 不可重复读(Non-repeatable Read)

通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。

与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。

举例(事务B提交后,事务A却读到了事务B已提交的数据,导致事务A两次读到地数据不一致):

3.3 幻读

在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。

事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。

举例(id主键唯一,事务A搜索id=10的数据,事务A搜索不到id=10的数据,然后事务B新增id=10的数据并提交,事务A更新id=10的数据却成功,插入id=10却失败,现在搜索id=10也有记录):

举例2:

1. 脏读的情况:对于两个事务T1与T2,T1读取了已经被T2更新但是还没有提交的字段之后,若此时T2回滚,T1读取的内容就是临时并且无效的

开启两个mysql客户端,并创建一张测试表transaction

更改默认隔离级别REPEATABLE READ为READ UNCOMMITTED,用于测试

SELECT @@tx_isolation; #查询隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; # 更改隔离级别

两个客户端同时开启事务,其中一个事务做UPDATE操作,另一个事务做SELECT

若此时黑色背景的客户端进行回滚,则白色背景的客户端读取的数据就是临时并且无效的。即脏读。

2. 不可重复读: 对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段并提交之后,T1再次提取同一个字段,值便不相等了。

重复读取的结果不一致的情况发生。

3. 幻读: 对于两个事务T1、T2,T1从表中读取数据,然后T2进行了INSERT操作并提交,当T1'再次读取的时候,结果不一致的情况发生。

mysql脏读和幻读区别_数据库的脏读、不可重复读和幻读区别相关推荐

  1. 脏读(脏数据、脏页)、不可重复读、幻读

    一.脏读(读到未提交的数据) 在理解脏读之前,需要理解脏数据的概念. 脏数据是指事务对缓冲池中行记录的修改,并且还没有提交. 注意脏数据和脏页是完全不同的两种概念,脏页指的是在缓冲池中已经被修改的页, ...

  2. mysql 快照读 幻读,InnoDB的MVCC如何解决不可重复读和快照读的幻读,当前读用next-key解决幻读...

    InnoDB默认的隔离级别是RR(可重复读),可以解决脏读和不可重复读,只解决了快照读情况下的幻读问题,当前读情况下解决幻读问题得靠next-key锁. mysql如何实现避免幻读: 在快照读读情况下 ...

  3. mysql事务隔离级别之锁实现原理,脏读、不可重复读、幻读出现原因及解决方案

    mysql事务隔离级别原理 观看了很多网上的博客,挺令人伤心,很难找到想要的答案... 一:所需知识 1,mysql中的锁 1.1,读锁(共享锁) 规则:若事务1对数据对象A加上读锁,则事务1只能读A ...

  4. 什么是脏读、不可重复读、幻读?别说你不知道

    脏读.不可重复读.幻读 在现代关系型数据库中,事务机制是非常重要的,假如在多个事务并发操作数据库时,如果没有有效的机制进行避免就会导致出现脏读,不可重复读,幻读. 脏读 1.在事务A执行过程中,事务A ...

  5. 不可重复读和幻读的区别_图解脏写、脏读、不可重复读、幻读

    MySQL 是支持多事务并发执行的,否则来一个请求处理一个请求,处理一个人请求的时候,别的人都等着,这网站就别做了,用户都要砸键盘了. 这里就有一个问题了:一个事务在写数据的时候,另一个事务要读这行数 ...

  6. 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  7. mysql 乐观锁 脏读_mysql 丢失更新1和2、脏读、不可重复读和幻读 事务隔离级别 悲观锁 乐观锁...

    事务是现代关系型数据库的核心之一.在多个事务并发操作数据库(多线程.网络并发等)的时候,如果没有有效的避免机制,就会出现以下几种问题: ( 第一类丢失更新 A事务撤销时,把已经提交的B事务的更新数据覆 ...

  8. mysql系列:加深对脏读、脏写、可重复读、幻读的理解

    关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样. 幻读的重点 ...

  9. 数据库隔离级别解决脏读、不可重复读、幻读

    一.脏读.不可重复读.幻读 脏读 读取了未提交的事务. 事务A读取了事务B中尚未提交的数据.如果事务B回滚,则A读取使用了错误的数据. 解决:如果一个事务在读的时候,禁止读取未提交的事务. 不可重复读 ...

  10. 数据库的脏读、不可重复读、幻读以及四种隔离级别

    一.数据库的脏读.不可重复读和幻读 1.脏读: (读取了未提交的新事物,然后被回滚了) 事务A读取了事务B中尚未提交的数据.如果事务B回滚,则A读取使用了错误的数据. 比如我给你转了100万,但是我还 ...

最新文章

  1. CSS3来绘制一个3维立体游泳圈_立体墙绘画绘制技巧来了,襄阳墙体彩绘公司介绍...
  2. EF架构~为分组添加位运算聚合方法
  3. 比特币在贬值但是不会出局
  4. sqlite3API函数
  5. AngularJs学习笔记--E2E Testing
  6. 【顶尖技术人是怎样炼成的】清华博士的模型信仰——对话阿里云 MVP陈旸
  7. 【Linux系统编程】进程替换:exec 函数族
  8. 长安大学研究生院计算机学院,研究生教育
  9. 深度学习-自然语言处理中的近似训练
  10. 64位c语言调用32位glibc,glibc fclose源代码阅读及伪造_IO_FILE利用fclose实现任意地址执行...
  11. Job中的Task是如何调度的
  12. myeclipse 快捷键(转载)
  13. 微程序相关的两个知识点
  14. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ..
  15. linux中运行环境变量,linux下的环境变量详解
  16. 明解c语言入门篇第三版第九章答案,明解C语言 入门篇 第一章答案
  17. 留言列表模板HTML代码
  18. 字节云数据库未来方向的探索与实践
  19. 自注意力机制(Self-Attention)
  20. 珍重了,我亲爱的朋友们

热门文章

  1. jQuery教程大纲
  2. java读取文件(java读取文件指定内容)
  3. mantis Linux安装教程,CentOS Linux安装mantis
  4. 倍福触摸屏维修操作面板维修CP7032-1031-0010故障分析
  5. Java写入磁盘阵列_磁盘阵列方案
  6. OpenStack之keystone(身份认证服务)
  7. 打jar包和使用jar包
  8. linux光盘文件的执行,Linux下读取光盘
  9. Carbon —— 代码分享利器
  10. 音乐与现代计算机技术,计算机音乐技术在音乐教育中的应用.doc