原子性和一致性的区别

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

  原子性和一致性的区别

  原子性和一致性都要保证一个数据的多个操作整体的成功或者失败,初看两者有一些相似的语义,其实细究一下还是略微有一些区别,原子性主要面向数据库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。

目录
相关文章
|
26天前
|
缓存 安全 Java
多线程的三大特性:原子性、可见性和有序性
多线程的三大特性:原子性、可见性和有序性
23 0
|
3月前
|
Java 数据库
数据原子性
数据原子性
85 3
|
4月前
|
关系型数据库 MySQL 数据库
事务和锁:保证数据一致性
事务和锁:保证数据一致性
32 0
|
5月前
|
Java
8.volatile为啥不能保证原子性?
8.volatile为啥不能保证原子性?
33 0
8.volatile为啥不能保证原子性?
|
9月前
|
安全 Java
【并发技术09】原子性操作类的使用
【并发技术09】原子性操作类的使用
|
10月前
volatile 的作用是什么?能保证原子性吗?能保证有序性吗?
volatile 的作用是什么?能保证原子性吗?能保证有序性吗?
71 0
|
11月前
|
SQL Java easyexcel
多线程事务如何保证效率和原子性
多线程事务如何保证效率和原子性
166 0
|
12月前
|
存储 缓存 安全
并发三要素 : 可见性, 原子性, 有序性
并发三要素:可见性, 原子性, 有序性,并发问题该怎样解决,怎样实现数据同步,这篇文章为您解决
66 0
|
Java 程序员
解决原子性问题?脑海中有这个模型就可以了
解决原子性问题?脑海中有这个模型就可以了
解决原子性问题?脑海中有这个模型就可以了
J3
|
Java 程序员 编译器
Java内存模型的顺序一致性问题
Java内存模型的顺序一致性问题
J3
124 1
Java内存模型的顺序一致性问题