数据库一致性理解

本文摘自知乎:

https://www.zhihu.com/question/31346392/answer/51924208

原子性:记录之前的版本,允许回滚

一致性:事务开始和结束之间的中间状态不会被其他事务看到

隔离性:适当的破坏一致性来提升性能与并行度 例如:最终一致~=读未提交。

持久性:每一次的事务提交后就会保证不会丢失

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

讲道理

定义:数据库一致性(Database Consistency)是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

数据库状态如何变化?每一次数据变更就会导致数据库的状态迁移。如果数据库的初始状态是C0,第一次事务T1的提交就会导致系统生成一个SYSTEM CHANGE NUMBER(SCN),这是数据库状态从C0转变成C1。执行第二个事务T2的时候数据库状态从T1变成T2,以此类推,执行第Tn次事务的时候数据库状态由C(n-1)变成Cn。

定义一致性主要有2个方面,一致读和一致写。

一致写:事务执行的数据变更只能基于上一个一致的状态,且只能体现在一个状态中。T(n)的变更结果只能基于C(n-1),C(n-2), ...C(1)状态,且只能体现在C(n)状态中。也就是说,一个状态只能有一个事务变更数据,不允许有2个或者2个以上事务在一个状态中变更数据。至于具体一致写基于哪个状态,需要判断T(n)事务是否和T(n-1),T(n-2),...T(1)有依赖关系。

一致读:事务读取数据只能从一个状态中读取,不能从2个或者2个以上状态读取。也就是T(n)只能从C(n-1),C(n-2)... C(1)中的一个状态读取数据,不能一部分数据读取自C(n-1),而另一部分数据读取自C(n-2)。

摆事实

一致写:
定义100个事务T(1)...T(100)实现相同的逻辑 update table set i=i+1,i的初始值是0,那么并发执行这100个事务之后i的值是多少?可能很容易想到是100。那么怎么从一致性角度去理解呢?

数据库随机调度到T(50)执行,此时数据库状态是C(0),而其它事务都和T(50)有依赖关系,根据写一致性原理,其它事务必须等到T(50)执行完毕后数据库状态变为C(1)才可以执行。因此数据库利用锁机制阻塞其它事务的执行。直到T(50)执行完毕,数据库状态从C(0)迁移到C(1)。数据库唤醒其它事务后随机调度到T(89)执行,以此类推直到所有事务调度执行完毕,数据库状态最终变为C(100)。

一致读:
还是上面的例子,假设T(1)...T(100)顺序执行,在不同的时机执行select i from table,我们看到i的值是什么?
1. T(1)的执行过程中。数据库状态尚未迁移,读到的i=0
2. T(1)执行完毕,T(2)的执行过程中,数据库状态迁移至C(1),读到的i=1

————————————————————————————————————————————————————————————————————————

时间: 2024-11-09 16:18:47

数据库一致性理解的相关文章

关于数据库一致性以及优化服务器的一些见解

昨晚跟朋友一起讨论了一个问题,关于他问我怎么保持数据库的一致性,以及这其中衍生出来的一些问题,我觉得我应该写个博客,至少自己觉得懂了许多. 抛个问题出来:什么是数据库的一致性呢? 答:既然抽象,那就举个例子出来,方便理解:比如说,抢单问题,当有一件物品的数量只有10件,而参与抢单的人却有10万个,很明显,物品数量是远远不够的,假设这10万个人同时发送请求进来,第一个人抢了,本来数据应该减1变成9的,但是同时进来的那些人取到的数是没有修改的,也就是还是10个,这就很明显不符合逻辑:如果你觉得这还不

数据库 一致性读&&当前读

今天小伙伴问了一个sql的问题: update t set status=2 where id in(select id from t where status=1) 这个sql,在并发的情况下,会不会有问题? 假设:下面的讨论,数据库的事务隔离级别是read_committed 其实这个可以很容易测试一下,得出结论:存在丢失更新的问题. 先来理解两个概念: 1. 一致性读 当前的数据库产品级别都实现了多版本一致性,即MVCC,那么有了MVCC,数据库实现了读写互不阻塞的效果. 但为了达到rea

以数据库思维理解区块链

作为一个数据库行业的老兵,我看到在区块链技术的热潮下,传统的IT技术同学们保持了十分理性,甚至是排斥的态度.其实不管是热捧还是排斥,两极观点之下,我认为我们应该从IT人比较能够理解的角度探讨一下区块链技术.因为区块链这个东西的本质和数据库技术非常相像,很多机制使用数据库的理念去理解会非常直观准确. 对于区块链和传统数据技术,我认为区块链技术的未来发展,主题是"融合".我们就从数据库这个角度来解读区块链技术体系中各个技术点,以及通过"去中心化数据库"这个概念,把区块链

[20140804] 疑似存储上线导致数据库一致性问题

背景: 同一个存储设备提供了2块存储,1块已经在使用 a,另外一块没有使用b. 疑似: 当b初始化,上线之后,导致在a存储的数据库文件出现一致性问题. 解决方法: 幸好有数据库镜像,打算切换数据库镜像,然后备份数据库镜像,还原到原来的master. 然后创建数据库镜像,在切换到原来的master上. [20140804] 疑似存储上线导致数据库一致性问题,布布扣,bubuko.com

oracle数据库基本理解

一.概念 1. 数据库 (Database) 什么是数据库? 数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合. 这种数据集合具有如下特点: 尽可能不重复,以最优方式为某个特定组织的多种应用服务,其数据结构独立于使用它的应用程序, 对数据的增.删.改和检索由统一软件进行管理和控制. 从发展的历史看,数据库是数据管理的高级阶段,它是由文件管理系统发展起来的. 什么是数据库系统? 数据库系统是一个实际可运行的存储.维护和应用系统提供数据的软件系统,是存储介质.处理对象和管理系统的集合体.

分布式缓存数据库一致性问题

缓存和数据库一致性问题,有很多解决方案,没有最完美的方案,只有适合自身业务的尽可能完美的方案. 缓存由于其高并发和高性能的特征,已经在项目中被广泛应用. 查询时一般先查询缓存,如果缓存命中的话,那么直接将数据返回. 如果缓存中没有数据(如失效,或者根本没设置数据),那么,应用程序先从数据库中查询数据,如果不为空,则将数据放在缓存中. 那么更新时,怎么处理缓存和数据库呢?先更新数据库后更新缓存?先更新数据库后更新缓存?或者先淘汰缓存后更新数据库? 为什么没有先更新缓存后更新数据库? 1):如果更新

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cach

[Sqlite]--&gt;嵌入式数据库事务理解以及实例操作

SQLite 事务(Transaction) 事务(Transaction)是一个对数据库执行工作单元.事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成. 事务(Transaction)是指一个或多个更改数据库的扩展.例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务.重要的是要控制事务以确保数据的完整性和处理数据库错误. 实际上,您可以把许多的 SQLite 查询联合成一组,把所

缓存与数据库一致性保证(转)

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数