当前位置: 首页 > news >正文

数据库ACID

ACID特性

数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

详解

1. 原子性

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

可采用“A向B转账”这个例子来说明解释

在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

2. 一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。

保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

3. 隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。

关于隔离性中的事务隔离等级(事务之间影响),参见相应博文

4. 持久性

这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)

write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

相关文章:

  • 线程小记
  • JAVA JDK1.8 时间戳与时间格式化 实用工具类
  • 单例模式 之内部类延迟加载,(多)线程安全
  • Springboot 用session监听器统计在线用户数量
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • JAVA 责任链设计模式
  • JAVA回调函数简单讲解 CallBack
  • JAVA HttpClient 远程调用接口doGet、doPost工具类
  • JAVA 接口签名sign生成 工具类
  • mybatis-config配置文件各项简单介绍
  • Springboot整合Mybatis增删查改、连接MYSQL数据库及配置druid连接池
  • JAVA 模板设计模式
  • Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入
  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • IDEA @AutoWired注入bean 出现红色波浪线
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • [case10]使用RSQL实现端到端的动态查询
  • 【剑指offer】让抽象问题具体化
  • 【面试系列】之二:关于js原型
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • If…else
  • input的行数自动增减
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaWeb(学习笔记二)
  • Swoft 源码剖析 - 代码自动更新机制
  • XML已死 ?
  • 基于游标的分页接口实现
  • 解决iview多表头动态更改列元素发生的错误
  • 浏览器缓存机制分析
  • 什么软件可以剪辑音乐?
  • 网页视频流m3u8/ts视频下载
  • 为视图添加丝滑的水波纹
  • 问题之ssh中Host key verification failed的解决
  • 想使用 MongoDB ,你应该了解这8个方面!
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • !$boo在php中什么意思,php前戏
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (超详细)语音信号处理之特征提取
  • (二)正点原子I.MX6ULL u-boot移植
  • (转)jQuery 基础
  • (转载)虚函数剖析
  • .net 7 上传文件踩坑
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .Net 高效开发之不可错过的实用工具
  • .NET 设计一套高性能的弱事件机制
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET企业级应用架构设计系列之结尾篇
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • @31省区市高考时间表来了,祝考试成功
  • @Import注解详解
  • @SuppressWarnings(unchecked)代码的作用
  • @取消转义
  • @我的前任是个极品 微博分析