文章参考:
https://robertovitillo.com/what-every-developer-should-know-about-database-consistency/
数据一致性
数据一致性是什么?
大部份使用传统关系型数据库的DBA在看到“数据一致性”时,第一反应可能都是数据在跨表事务中的数据一致性场景。但是本文介绍的“数据一致性”,指的是“数据在多份副本中存储时,如何保障数据的一致性”场景。
由于在大数据领域,数据的安全不再由硬件来保证,而是通过软件手段,通过同时将数据写入到多个副本中,来确保数据的安全。数据库在同时向多个副本写入记录时,如何确保每个副本数据一致,称为“数据一致性”。
与数据库事务一致性的区别
数据库事务的ACID的中也有一个一致性(consistency),但彼一致性非此一致性。ACID中的一致性是指,数据库的事务的执行,或者说事务观察到的数据,总是要满足某些全局的 一致性 约束条件,如唯一性约束,外键约束等。这个概念和数据库的数据是否多副本没关系。而本文的一致性在多副本的语境下才有意义。所以,数据库事务的一致性,是指数据项之间总是满足某些约束条件,或者说整个数据库在满足约束条件的意义上是正确的。
更让人崩溃的是,事务的隔离性也容易和这里的一致性混淆,因为它和一致性模型类似,限定了某种并发操作的执行顺序。事务的隔离性是指并发执行的事务,能以多大的程度看到看到彼此。这个概念也和数据是否多副本没有关系,单副本的单机数据库也需要支持不同的隔离级别。比如,如果数据库设定为可串行化(serializable)隔离级别,那么并发事务的执行结果,必须等价为让这些事务以某种顺序串行执行的结果。事务的隔离性,是为了并发程序(客户端程序)正确性而生的一种编程抽象,可以类比多线程程序访问共享数据时候需要解决的竞争。在实际系统中,事务是由一系列读写操作组成的,原子的事务的中间状态是可能被并发的其他事务“观察”到的。而在一致性模型的讨论中,我们假设读写操作在服务端是“瞬时”完成的,也就是说,读写操作本身是原子的。
关系型数据库如何保障数据一致性?
传统的关系型数据库对于运行环境–硬件要求都比较高,例如Oracle会建议用户使用小型机+共享存储作为数据库的运行环境,DB2 DPF也同样建议用户采用更好的服务器+高端存储来搭建数据库的运行环境。所以在数据存储安全的技术要求下,传统关系型数据库更多是依赖硬件的技术来