数据库的ACID是什么

article/2025/9/29 20:45:05

欢迎大家关注我的公众号【老周聊架构】,Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。

事务在当今的企业系统无处不在,即使在高并发环境下也可以提供数据的完整性。一个事务是一个只包含所有读/写操作成功的集合。如下图:

在这里插入图片描述

一、事务本质上有四个特点ACID:

  • Atomicity 原子性
  • Consistency 一致性
  • Isolation 隔离性
  • Durability 耐久性

原子性

原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。

一致性

一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

一致性有下面特点:

  • 如果一个操作触发辅助操作(级联,触发器),这些也必须成功,否则交易失败。
  • 如果系统是由多个节点组成,一致性规定所有的变化必须传播到所有节点(多主复制)。如果从站节点是异步更新,那么我们打破一致性规则,系统成为“最终一致性”。
  • 一个事务是数据状态的切换,因此,如果事务是并发多个,系统也必须如同串行事务一样操作。

在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。

“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”

大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。

隔离性

事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。

耐久性

一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。

尽管一些数据库系统提供多版本并发控制 MVCC, 他们的并发控制都是通过锁完成,因此,锁会增加执行的串行性,影响并发性。

二、SQL标准规定了四个隔离水平:

  • READ_UNCOMMITTED
  • READ_COMMITTED
  • REPETABLE_READ
  • SERIALIZABLE

在这里插入图片描述

脏读

在这里插入图片描述

脏读发生在:当一个事务允许读取一个被其他事务改变但是未提交的状态时,这是因为并没有锁阻止读取,如上图,你看到第二个事务读取了一个并不一致的值,不一致的意思是,这个值是无效的,因为修改这个值的第一个事务已经回滚,也就是说,第一个事务修改了这个值,但是未提交确认,却被第二个事务读取,第一个事务又放弃修改,悔棋了,而第二个事务就得到一个脏数据。

不可重复读

在这里插入图片描述

反复读同一个数据却得到不同的结果,这是因为在反复几次读取的过程中,数据被修改了,这就导致我们使用了stale数据,这可以通过一个共享读锁来避免。这是隔离级别READ_COMMITTED会导致可重复读的原因。设置共享读锁也就是隔离级别提高到REPETABLE_READ。

幻读

在这里插入图片描述

当第二个事务插入一行记录,而正好之前第一个事务查询了应该包含这个新纪录的数据,那么这个查询事务的结果里肯定没有包含这个刚刚新插入的数据,这时幻影读发生了,通过变化锁和predicate locking避免。

三、下图是主流数据库的默认隔离级别:

DatabaseDefault isolation Level
OracleREAD_COMMITTED
MySQLREPETABLE_READ
Microsoft SQL ServerREAD_COMMITTED
PostgreSQLREAD_COMMITTED
DB2CURSOR STABILITY (a.k.a READ_COMMITTED)

READ_COMMITED 是正确的选择,因为SERIALIZABLE虽然能在不同事务发生时避免stale数据,也就是避免上述丢失刚刚修改的数据,但是性能是最低的,因为是一种最大化的串行。


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

相关文章

谈谈数据库的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客户…

Windows-Linux下的SVN服务器搭建及SVN操作

一、Windows下的SVN服务器搭建 首先准备一下三个软件&#xff1a; 1. VisualSVN-Server-3.8.0-x64.msi&#xff08;svn服务端&#xff09; 2. TortoiseSVN-1.9.6.27867-x64-svn-1.9.6.msi&#xff08;svn客户端&#xff09; 3. TortoiseSVN中文语言包_1.9.6.27867-x64-zh_…

SVN服务器搭建、客户端安装超详细图解教程

目录 一、安装包下载 1.下载 TortoiseSVN 服务器安装包 2.下载 TortoiseSVN 客户端安装包 二、详细安装过程图解 1.TortoiseSVN 服务器安装 2.TortoiseSVN 客户端安装 一、安装包下载 1.下载 TortoiseSVN 服务器安装包 >> 官网下载 Windows 平台安装包在网页最底…