早期的表锁和现在的行锁。SQL 数据在并发的情况下,为了维持数据一致性,往往会进行锁。早期的 MySQL 采用的 MyISAM 类型的表,为了提高性能,使用了“表锁”,但是在互联网应用下,很快就发现,这种“提高性能”的设计实际上是不符合实际的。因为互联网业务并发量非常大,导致了频繁的锁表,加上关系型数据表没有分布能力,导致请求进一步集中,更加恶化了这种情况。所以后期 MySQL 改为使用 InnoDB 表格式,付出更多的性能代价换取“行”锁,有效缓解了这一问题。但是“行”锁依然在大并发的情况下,有可能付出较高的延迟性代价,特别是碰到上面所说的错误 #1 和错误 #2,扩大了故障的损害蔓延。
主从同步失效导致的业务故障。作为典型的“读写分离”场景,使用主从同步是 MySQL 最常见的使用方法。但是主从同步本身,在网络出现偶发故障,以及其他一些故障(如磁盘满)的时候,缺乏自我恢复的能力。如果业务依赖于主从同步,很容易出现不可发现的数据错误。如果这些数据错误在业务逻辑上是无法纠正的,那么就导致了最严重的事故——数据损坏。而且主从同步从另外一个角度来看,也是破坏了关系型数据库关于强一致性的承诺,这就衍生出大量需要“经验”才能解决的业务逻辑设计问题。