原子性和一致性的区别

简介: 原子性和一致性的区别

  原子性和一致性的区别

  原子性和一致性都要保证一个数据的多个操作整体的成功或者失败,初看两者有一些相似的语义,其实细究一下还是略微有一些区别,原子性主要面向数据库Write的行为定义,而一致性主要面向Read的行为定义。 拿实际例子来说,在分布式场景下如果涉及多节点的数据操作,在微观世界里就不能保障多节点的操作发生在同一时刻,一定是有细微的时间差,在这个时间差内如果用高并发Read操作是否就会看到转账过程中不一致的余额状态?因此数据库技术通常会借助锁机制或者MVCC多版本来实现一致性的行为。比如通常的分布式2PC,会在第一阶段prepare加锁,确保在第二阶段部分节点提交时,剩余部分节点未提交的数据会通过加锁,避免高并发Read操作读到中间提交一半状态的数据。

  隔离级别的技术演进

  隔离级别的发展比较有故事性,不同数据库产商有各自的实现,缺乏统一的标准。

  在1992年ANSI首先尝试指定统一的隔离级别标准,当时主要是基于锁机制来实现事务的并发控制隔离,定义了脏读、不可重复读、幻读的异像,ANSI 92标准中指出可以解决这三类异像的事务隔离称之为"可串行化"。

  在1995年,微软的Jim Gray研究员们在《A Critique of ANSI SQL Isolation Levels》论文中批判了ANSI标准,新增了Lost Update(更新丢失)、Read/Write Skew(读写偏序)的异像场景,同时正式提出基于MVCC的快照隔离级别SI。 而当时的Oracle是第一个在商业数据库中应用MVCC的技术,将其基于MVCC的SI隔离技术称之为"可串行化",主要是因为ANSI 92标准中对解决不可重复读、幻读异常定义的技术称之为可串行化,属于特定的文字游戏。

  在1999年,在《Generalized Isolation Level Definitions》论文中提出了有向串行图DSG(Direct Serialization Graph)的隔离定义,可以在SI隔离级别的基础上解决Read/Write Skew(读写偏序)的异像问题,称之为SSI(Serializable Snapshot Isolation),主要的代表数据库为PostgreSQL/CockroachDB。

目录
相关文章
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
217012 68
|
存储 算法 NoSQL
探秘HyperLogLog:Redis中的基数统计黑科技
探秘HyperLogLog:Redis中的基数统计黑科技
571 0
|
9月前
|
消息中间件 存储 缓存
kafka 的数据是放在磁盘上还是内存上,为什么速度会快?
Kafka的数据存储机制通过将数据同时写入磁盘和内存,确保高吞吐量与持久性。其日志文件按主题和分区组织,使用预写日志(WAL)保证数据持久性,并借助操作系统的页缓存加速读取。Kafka采用顺序I/O、零拷贝技术和批量处理优化性能,支持分区分段以实现并行处理。示例代码展示了如何使用KafkaProducer发送消息。
|
11月前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
443 3
|
JavaScript 前端开发
var、let和const的作用及区别
这篇文章详细解释了JavaScript中`var`、`let`和`const`三种变量声明方式的作用及它们在作用域、可变性、变量提升等方面的区别,并提供了示例代码来阐明各自的特性和适用场景。
|
存储 Java Spring
使用Spring Boot和Zookeeper实现服务协调
使用Spring Boot和Zookeeper实现服务协调
|
应用服务中间件 nginx
解密Nginx的高性能魔法:事件驱动与异步非阻塞模型
总之,Nginx的高性能魔法基于事件驱动和异步非阻塞模型,使其能够处理大量并发连接,同时保持低系统资源消耗。这是Nginx在处理Web请求时出色性能的关键因素。
344 1
|
定位技术
高德的一次性定位不返回结果问题
高德的一次性定位不返回结果问题
360 0
|
Java 开发工具
IDEA中配置阅读并编辑jdk8源码的环境
IDEA中配置阅读并编辑jdk8源码的环境前言
IDEA中配置阅读并编辑jdk8源码的环境