我正在考虑使用一种noSQL方案来处理当前的项目,但是我对很多这些数据库中的“最终一致性”条款感到犹豫。最终一致性与处理复制滞后的mySQL数据库有什么不同吗?在需要立即数据一致性时,我过去使用的一种解决方案是从主服务器读取。
然而,我对关系型数据库声称具有强数据一致性感到困惑。我猜我应该使用事务,并且那会给我强一致性。那么,假设mySQL复制可能会滞后,编写应用程序时是否明智?
我正在考虑使用一种noSQL方案来处理当前的项目,但是我对很多这些数据库中的“最终一致性”条款感到犹豫。最终一致性与处理复制滞后的mySQL数据库有什么不同吗?在需要立即数据一致性时,我过去使用的一种解决方案是从主服务器读取。
然而,我对关系型数据库声称具有强数据一致性感到困惑。我猜我应该使用事务,并且那会给我强一致性。那么,假设mySQL复制可能会滞后,编写应用程序时是否明智?
在ACID中,一致性意味着在任何更改之前和之后都满足所有约束条件。当系统确保您无法读取不一致的数据时,例如他们说您永远不会读取其中一个子行引用不存在的父行,或者只应用了一半事务但另一半还没有应用(经典示例是从一个银行账户借记但尚未为收件人银行账户贷记)。
MySQL中的复制默认情况下是异步的,或者最好是“半同步”的。在任何一种情况下,它都有延迟。实际上,复制副本始终落后于至少一小部分秒,因为主服务器直到事务提交才写入其二进制日志,然后副本必须下载二进制日志并中继事件。
但更改仍然是原子的。不能读取部分更改的数据。您可以读取已提交的更改,在这种情况下,满足所有约束条件,否则更改尚未提交,在这种情况下,您将看到事务开始前的数据状态。
因此,在滞后的复制系统中,您可能会暂时读取旧数据,但不会读取不一致的数据。
而在“最终一致性”的系统中,您可能会读取部分更新的数据,其中一个账户已被借记,但第二个账户尚未贷记。因此,您可以看到不一致的数据。
如果您的应用程序需要绝对实时数据,则确实需要小心从副本中读取。每个应用程序都有不同的复制延迟容忍度,实际上,在一个应用程序中,不同的查询对延迟有不同的容忍度。关于此我做了一个演示:MySQL和PHP的读写分离(Percona网络研讨会2013)