ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。

1.原子性(atomicity):

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。 回滚实际上是一个比较高层抽象的概念,大多数DB在实现事务时,是在事务操作的数据快照上进行的(比如,MVCC),并不修改实际的数据,如果有错并不会提交,所以很自然的支持回滚。 而在其他支持简单事务的系统中,不会在快照上更新,而直接操作实际数据。可以先预演一边所有要执行的操作,如果失败则这些操作不会被执行,通过这种方式很简单的实现了原子性。

2.一致性(consistency):

数据库总是从一个一致性的状态转换到另一个一致性的状态。事务的一致性决定了一个系统设计和实现的复杂度,也导致了事务的不同隔离级别。

事务可以不同程度的一致性:

  • 强一致性:读操作可以立即读到提交的更新操作。
  • 弱一致性:提交的更新操作,不一定立即会被读操作读到,此种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间
  • 最终一致性:是弱一致性的特例。事务更新一份数据,最终一致性保证在没有其他事务更新同样的值的话,最终所有的事务都会读到之前事务更新的最新值。如果没有错误发生,不一致窗口的大小依赖于:通信延迟,系统负载等。

其他一致性变体还有:

  • 单调一致性:如果一个进程已经读到一个值,那么后续不会读到更早的值。
  • 会话一致性:保证客户端和服务器交互的会话过程中,读操作可以读到更新操作后的最新值。

3.隔离性(isolation):

并发事务之间互相影响的程度,比如一个事务会不会读取到另一个未提交的事务修改的数据。在事务并发操作时,可能出现的问题有:

  • 脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
  • 不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
  • 幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。

事务的隔离级别从低到高有:

  • Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生
  • Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
  • Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
  • Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

通常,在工程实践中,为了性能的考虑会对隔离性进行折中。

4.持久性(durability):
一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且不可能有能做到100%的持久性保证策略。

原文链接:https://www.zhihu.com/question/31346392/answer/59815366

数据库acid简介(一)相关推荐

  1. mysql的acid_什么是数据库ACID?

    并发主题 什么是数据库ACID? 事务在当今的企业系统无处不在,即使在高并发环境下也可以提供数据的完整性.一个事务是一个只包含所有读/写操作成功的集合.如下图: 一个事务本质上有四个特点ACID: A ...

  2. 图数据库Neo4j简介

    图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园 https://www.cnblogs.com/loveis715/p/5277051.html 最近我在 ...

  3. Database:Database数据库的简介、类型及其区别(关系数据库VS非关系型数据库)、案例应用之详细攻略

    Database:Database数据库的简介.类型及其区别(关系数据库VS非关系型数据库).案例应用之详细攻略 目录 Database数据库的简介 1.掌握数据库的方法-学会sql语言进而学会增.删 ...

  4. BigData之MongoDB:MongoDB基于分布式文件存储数据库的简介、下载、案例应用之详细攻略

    BigData之MongoDB:MongoDB基于分布式文件存储数据库的简介.下载.案例应用之详细攻略 目录 MongoDB的简介 1.MongoDB的主要功能特性 2.对MongoDB进行增删改查( ...

  5. [Qt教程] 第21篇 数据库(一)Qt数据库应用简介

    [Qt教程] 第21篇 数据库(一)Qt数据库应用简介 楼主  发表于 2013-5-13 20:56:39 | 查看: 1403| 回复: 13 Qt数据库应用简介 版权声明 该文章原创于作者yaf ...

  6. Visual SourceSafe 数据库安全性简介

    Visual SourceSafe 数据库安全性简介 作者:佚名    文章来源:网络    点击数: 327    更新时间:2007-6-18 Visual SourceSafe 数据库安全性简介 ...

  7. 图数据库HugeGraph简介与快速入门

    图数据库HugeGraph简介与快速入门 作者:胡佳辉(家辉),日期:2019年2月10日 CSDN博客:https://blog.csdn.net/gobitan 1. HugeGraph简介 1. ...

  8. MongoDB数据库的简介与安装步骤

    MongoDB数据库的简介与安装步骤 简介 特点 安装步骤 简介 MongoDB是一个基于分布式文件存储的数据库,可为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB介于关系数据库和非关系 ...

  9. linux环境中QT程序连接达梦数据库DM7简介

    linux环境中QT程序连接达梦数据库DM7简介 一.安装UnixODBC 1.下载UnixODBC安装包 下载地址:ftp://ftp.unixodbc.org/pub/unixODBC/unixO ...

最新文章

  1. linux复制压缩文件,Linux如何复制,打包,压缩文件
  2. 硬件手册里经常出现的assert以及deassert
  3. java 原生数据类型的转换_Java基本数据类型转换分析
  4. Webservice入门教程_编写手机归属地查询的webservice
  5. 测试Open Live Writer
  6. 用代码判断当前系统是否支持某个版本的feature
  7. 高性能Javascript 分割任务学习笔记
  8. 研华GPIO的功能实现代码
  9. 机器学习--组合分类方法之AdaBoost算法实战(单层决策树原理代码详解)
  10. Java中异常处理和设计
  11. python爬取网易云音乐歌词_python3爬取网易云音乐歌单里的歌词(含源码)
  12. PS4蓝牙手柄分析之1
  13. Re-ranking Person Re-identification with k-reciprocal Encoding
  14. Word中打开Visio绘图错误:找不到服务器应用程序、源文件或项目
  15. [雪峰磁针石博客]python3标准库-中文版2:内置函数
  16. SDUT第二次选拔赛 7-2魔镜与抽卡
  17. js 正则校验 长数字 电话号码 银行卡号
  18. 多分类学习:OvO、OvR、ECOC
  19. 笔记本电脑连接显示器如何让笔记本电脑单纯作为一台主机进行使用/笔记本连接显示器以后只需要显示器进行显示的操作! 2021/1/16
  20. ISTQB- TTA大纲

热门文章

  1. python打开指定文件-python打包压缩、读取指定目录下的指定类型文件
  2. python三层装饰器-python中自带的三个装饰器的实现
  3. python类装饰器详解-Python 类装饰器解析
  4. 自学python好找工作吗-自学Python如何找工作?多久能找到工作?
  5. python基础教学视频-Python基础教程(附教学视频)
  6. python爬虫抓取图片-python网络爬虫源代码(可直接抓取图片)
  7. python语言基础-详细的总结一下python入门基础语言知识!
  8. python切片语法-Python切片符号(:)用法及示例
  9. python主要用于什么-python主要用于哪些方向
  10. 在python中、下列代码的输出是什么-python面试题详细总结(附答案)