ACID

article/2025/9/29 20:48:23

细节其实很多。。。

1 到底什么是ACID

首先需要说明的是,在IT领域,很多名词在不同的上下文环境中的语义是不同的。例如某些产品宣称支持“100% ACID”和“强一致性”等。那么,这些名词到底指的是什么?如果不结合具体的语境,我们很可能产生各种误解。在没有NoSQL,也更没有NewSQL之前,我们需要关注的是数据库产品支持的隔离级别的差异,而不需要关心它们到底实现了ACID没有。因为ACID是数据库产品的根本,不同产品之间的差异可以说是微乎其微。ACID最容易导致歧义的术语就是隔离级别,不同数据库产品支持的隔离级别、SQL标准定义的隔离级别不仅在名字上有区别,在实际含义上也有区别。例如:Oracle的可串行化其实是Snapshot Isolation1;DB2的Repeatable Read其实是Serializable2。ACID中的I(Isolation)在学术界默认指的就是可串行化,要不然问题也不会复杂到研究了几十年还有的玩。没有了可串行化,ACID中的Consistency也自然不靠谱了。文章34中列出了18个数据库产品,对比它们提供的默认隔离级别以及最高隔离级别。这里截个图供参考。


既然可串行化那么重要,那数据库为什么还要提供比可串行化低的隔离级别?可串行化确实在数据库不了解应用程序逻辑的情况保证数据一致性的问题。但是它是要付出代价的,往往会导致系统的性能损失。较低的隔离级别可以提高性能、可用性,也能满足应用的很多需求。例如,在基于封锁实现的系统中,读可以加短锁,从而使得事务不容易死锁或回滚。当然了,低隔离级别会导致各种各种的一致性异常2。既然存在这么多的问题,那为什么低隔离级别用得还很多呢?文章3说One possibility is that anomalies are rare and the performance benefits of weak isolation outweigh the cost of inconsistencies. Another possibility is that applications are performing their own concurrency control external to the database; database programmers can use commands like SELECT FOR UPDATE, manual LOCK TABLE, and UNIQUE constraints to manually perform their own synchronization. 这个解释比较符合应用开发中的实际情况。

2 高可用事务而不是CAP

文章3是VLDB2014的论文。题目"Highly Available Transactions: Virtues and Limitations"是应该仿照" J. Gray. The transaction concept: Virtues and limitations. In VLDB 1981."起的。它考虑的是这种场景:

  1. 广域网环境下的HA,文章强调网络故障(网络分区)以及时延,而且试验环境也是Amazon上的LevelDB。
  2. 多副本,所以保证你不了可串行化。只能在弱一些的隔离级别上做。

数据库的隔离级别和分布式系统的副本一致性(transactional isolation, replica consistency)在概念上不太统一,它将这些概念以及高可用系统统一考虑。这样至少可以帮我们解决前面提到的术语含义问题。网络分区时可串行化是做不到的:Indeed, serializable transactions—the gold standard of traditional ACID databases—are not achievable with high availability in the presence of network partitions [.27]. 不考虑HA时,传统的分布式可串行化和SI机制:We have a strong understanding of weak isolation in the single-server context from which it originated [2, 11, 37] and many papers offer techniques for providing distributed serializability [13, 24, 26, 41, 60] or snapshot isolation [42, 58]. 这些系统实际上也是有各种各样的前提条件的。

什么是HA,论文第4节对此做出了定义:HA,Sticky A,Transactional A。定义Sticky A时又引入了全复制系统和不完全复制系统的概念。实际系统大部分都是不完全复制的。按照脚注的说明,sharding系统应该属于不完全复制的特例(每个数据只有一个副本)。至于什么是HAT,论文第5节专门描述它:HAT systems provide transactions with transactional availability or sticky transactional availability。并且列出了HAT可以做到和不能做到的语义。

HAT可以做到:

  1. 原子性(不管涉及到多少个节点)
  2. RC和RR
  3. 会话级别的read-your-writes,monotonic reads (i.e., time doesn’t go backwards), and causality within and across transactions
  4. Eventual consistency, meaning that, if writes to a data item stop, all transaction reads will eventually return the last written value

HAT做不到:

  1. 分区后的数据recency
  2. HATs cannot be “100% ACID compliant” as they cannot guarantee serializability, yet they meet the default and sometimes maximum guarantees of many “ACID” databases.
  3. HATs cannot guarantee global integrity constraints (e.g., uniqueness constraints across data items) but can perform local checking of predicates (e.g., per-record integrity maintenance like null value checks).

3 列出所有的现象/异常

  1. 传统数据库隔离级别相关的现象/异常。
    • P0, Dirty Write
    • P1, Dirty Read
    • P2, Non-repeatable Read, Fuzzy Read
    • P3, Phantom,注意包括插入、删除和更新三种情况
    • P4, Lost Update
    • A5 (Data Item Constraint Violation)
      • A5A Read Skew
      • A5B Write Skew
    • A Critique中有,但是这里没有单独列出来的:P4C,A1,A2,A3。
    • MAV,读到事务的原子的修改
    • RA,Read Atomic isolation,类似Oracle的TSC
  2. 会话相关的现象/异常。
    • Read Your Writes
    • Monotonic Writes
    • Monotonic Reads
    • Writes Follow Reads
    • Pipelined Random Access Memory (是上面前三者的组合)
    • Causal consistency(是上面前四者的组合,也就是PRAM和Writes Follow Reads的组合)
  3. 分布式系统一致性相关的现象/异常。
    • Recency(这个似乎是多出来的,应该不算)
    • Safe Register
    • Regular Register
    • Linearizability
  4. 可串行化
    • 传统的可串行化定义的是单副本的场景。
    • 在多副本的场景下,定义One-copy可串行化。
    • 它与Linearizability一起构成了严格可串行化。


Footnotes:

1 

http://iggyfernandez.wordpress.com/2010/09/20/dba-101-what-does-serializable-really-mean/

2 

http://research.microsoft.com/pubs/69541/tr-95-51.pdf

3 

http://www.bailis.org/blog/hat-not-cap-introducing-highly-available-transactions/

4 

http://www.bailis.org/blog/when-is-acid-acid-rarely/


http://chatgpt.dhexx.cn/article/WaIGcv2q.shtml

相关文章

[MySQL]事务ACID详解

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念 2. 事务的特性 3.事务控制语法…

数据库的ACID是什么

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 事务在当今的企业系统无处不在,即使在高并发环境下也可以提供数据的完整性。一个事务是一个只包含所有读/写操作成功…

谈谈数据库的ACID

谈谈数据库的ACID 帅宏军 一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金…

数据库中的 ACID 属性

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 大多数使用数据库的程…

什么是ACID?它的特性是什么?

https://baijiahao.baidu.com/s?id1743501877867119042&wfrspider&forpc ACID是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性&…

事务ACID理解

事务管理(ACID) 谈到事务一般都是以下四点 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务前后数据…

vue页面刷新 reload()

首先在vue里配置 在所想添加reload的vue里直接如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190610082256841.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTAxMTkxMA…

重识Nginx - 16 Nginx reload流程浅析

文章目录 图解reload流程1.向master程发送HUP号( reload命令)2.master进程校验配置语法是否正确3.master进程打开新的监听端口4.master进程用新配置启动新的worker 进程5.master进程向老worker 进程发送QUIT号6.老worker进程关闭监听句柄,处理完当前连接后结束进程 图解reload流…

vue this.reload 方法 配置, 优于window.reload()的页面刷新

相关网址: https://www.cnblogs.com/yinn/p/9056731.html 1.场景 在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。 2.遇到的问题 1. 用vue-router重新路由到当前页面,页面是不进行刷新的 2.采用window.re…

Nginx reload

解释 /usr/local/nginx/sbin/nginx -s reload 用过多次这条命令,一直以为是重启Nginx,今天有幸看了下Nginx官方文档介绍这条命令 Nginx服务不会终止,主进程检查配置,应用配置的过程。主进程会启动一个新的工作进程处理新来的请求…

layui table.reload()

使用table.reload()重载去搜索特定列 html <div class"searchTable" id"searchTable"><div class"layui-inline"><input class"layui-input layui-inline" id"badge" placeholder"badge" autoc…

为什么 NGINX 的 reload 命令不是热加载?

这段时间在 Reddit 看到一个讨论&#xff0c;为什么 NGINX 不支持热加载&#xff1f;乍看之下很反常识&#xff0c;作为世界第一大 Web 服务器&#xff0c;不支持热加载&#xff1f;难道大家都在使用的 nginx -s reload 命令都用错了&#xff1f;带着这个疑问&#xff0c;让我们…

Unity 手动编译 Reload脚本 减少等待时间

Unity 手动编译 Reload 脚本 这是个自定义reload domain工具,加快工作流,减少等待.测试版本是Unity2021,理论上来说2020以上都可. 脚本地址:UnityManualReload (github.com) 在Unity中遇到的问题 在unity工作流中,修改脚本->编译脚本->reload domain(重载域)-> 进…

layui table reload 重载

在所有记录中通过姓名搜索需要的数据&#xff0c; 搜索记录为空时返回所有记录 HTML&#xff1a; 方法渲染table&#xff1a; 表格重载&#xff1a; reload将再次访问servlet 第一次访问&#xff1a; reload访问&#xff1a; ennn&#xff0c;然后就是后台操作了&#xff0c;我…

搬运 auto_reload preload

原文&#xff1a; STM32CubeMX配置时钟中的auto-reload precload_飞由于度的博客-CSDN博客 STM32的定时器开发基础的时候&#xff0c;产生了一个疑问&#xff0c;这里不需要使能自动重装载吗&#xff1f; 带着这个疑问我去查了一下《STM32 HAL 库开发实战指南》&#xff0c;在…

4、Nginx命令(reload很重要)

Nginx命令&#xff08;reload很重要&#xff09; ./nginx -s reload &#xff1a;当我们更改了配置文件&#xff0c;我们都要重新加载我们的配置文件也就是reload例如我们的更改端口号变80位8080 连接不上的操作

js 刷新当前页面的方法 reload() , replace()的简单使用

本文为大家介绍三种 js 刷新当前页面的方法&#xff0c;我是在vue实例下写的&#xff1a; 添加定时器是为了直观看到刷新效果&#xff08;每次刷新都会重置为0&#xff09;&#xff1b; reload() 方法; replace() 方法; 页面自动刷新; reload() 方法 reload()方法用于刷新当…

SVN 服务器的搭建

当做大的项目是&#xff0c;svn是代码管理的好工具&#xff0c;如果是用自己的服务器&#xff0c;那么需要搭建SVN服务器。 Subversion是一款非常优秀的svn服务器工具&#xff0c;笔者采用VisualSVN server &#xff0c;因为它集成了apache,不用再进行过多的配置。 首先下载安…

SVN服务器搭建与使用

TortoiseSVN&#xff08;1.9.5&#xff09;与VisualSVN Server搭建SVN版本控制系统&#xff08;中文版&#xff09; 参考文献&#xff1a;http://www.cnblogs.com/xing901022/p/4399382.html 本片主要介绍如何搭建SVN版本控制系统&#xff0c;主要使用工具&#xff1a; 1. 服…

svn的搭建和使用

一&#xff1a;SVN服务器搭建和使用。 1. 首先来下载和搭建SVN服务器,下载地址如下: http://subversion.apache.org/packages.html&#xff0c;进入网址后&#xff0c;滚动到浏览器最底部看到如下截图&#xff1a; 个人认为最好用VisualSVN server 服务端和 TortoiseSVN客户…