文档章节

数据库的脏读、幻读、不可重复读

问题达人
 问题达人
发布于 2017/05/24 21:03
字数 941
阅读 117
收藏 1

数据库事务的特征 数据库事务特征ACID。

  • A Atomicity 原子性 事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行,
  • C Consistent 一致性 在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。
  • I Isolation 隔离性 数据库允许多个并发事务同事对数据进行操作,隔离性保证各个事务相互独立,事务处理时的中间状态对其它事务是不可见的,以此防止出现数据不一致状态。可通过事务隔离级别设置:包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
  • D Durable 持久性 一个事务处理结束后,其对数据库的修改就是永久性的,即使系统故障也不会丢失。

脏读、幻读、不可重复读

脏读:一个事务还未提交,另外一个事务访问此事务修改的数据,并使用,读取了事务中间状态数据。 幻读:一个事务读取2次,得到的记录条数不一致,由于2次读取之间另外一个事务对数据进行了增删。 不可重复读:一个事务读取同一条记录2次,得到的结果不一致,由于在2次读取之间另外一个事务对此行数据进行了修改。

  • 解决方法

设置不同的事务隔离级别:

  • 未授权读取 也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
  • 授权读取 也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
  • 可重复读取(Repeatable Read) 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
  • 序列化(Serializable) 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

© 著作权归作者所有

问题达人
粉丝 14
博文 94
码字总数 87450
作品 0
昌平
程序员
私信 提问
事务隔离级别 与数据库事务错误异常 总结

因为我老是容易忘记 或者搞错 这些 内容,而 有一次面试还问到了,突然想不起了。总结一下 会发生的数据问题 设置的事务隔离级别 解决办法:设置事务隔离级别 描述 默认数据库设置的事务 脏读...

之渊
07/18
29
0
仅此一文让你明白事务隔离级别、脏读、不可重复读、幻读

百度一下数据库事务隔离,脏读等,我想也是一堆。有些老学究扯一堆理论,有些通篇全是代码,都让人看的有种说不出蛋疼的感觉。本文用图文并茂的方式,配上行云流水般的代码,非要摆清楚这个问...

李玉宝的代码人生
02/25
0
0
mysql事务的隔离级别

事务隔离级别(transaction isolation levels):隔离级别就是对事务并发控制的四个等级。分为 1 串行化(SERIALIZABLE) 2 可重复读(REPEATABLE READ) 3 读已提交(READ COMMITED) 4 读未提交(...

Vincent-Duan
2015/03/31
100
0
数据库的ACID与隔离级别随笔

数据库中事务的四大特性(ACID) 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity)   原子性是指事务包含的所有操作要么全部成功,要么全...

一只努力的码农
2017/11/07
52
0
脏读、幻读、不可重复读和丢失更新

1.脏读 -- 一个事务读取到另外一个事务没有提交的数据 事务T1:更新一条数据 -->事务T2:读取事务T1更新的记录 事务T1:调用commit进行提交 此时事务T2读取到的数据是保存在数据库内存中的数...

拐美人
2018/06/11
25
0

没有更多内容

加载失败,请刷新页面

加载更多

用原生js对表格排序

本文转载于:专业的前端网站➸用原生js对表格排序 阿里的模拟笔试题,当时时间有限没写出来,其实是因为自己对原生dom操作不熟悉,这里补一下。 题目的大意是有一个表格,如代码所示 <table>...

前端老手
22分钟前
3
0
IT兄弟连 HTML5教程 HTML5表单 HTML5新增表单元素

HTML5有一些新的表单元素:<datalist>、<keygen>、<output>。不是所有的浏览器都支持HTML5新的表单元素,但即使浏览器不支持该表单属性,仍然可以显示为常规的表单元素。 1 <datalist>元素 ...

老码农的一亩三分地
23分钟前
3
0
【朝花夕拾】Android自定义View篇之(一)View绘制流程

https://www.cnblogs.com/andy-songwei/p/10955062.html

shzwork
25分钟前
4
0
Qt编写自定义控件70-扁平化flatui

一、前言 对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产...

飞扬青云
35分钟前
2
0
教你玩转Linux—添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部