MySQL的半一执行读
Posted _雪辉_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的半一执行读相关的知识,希望对你有一定的参考价值。
文章目录
一、什么是半一致性读
半一致性是指在分布式系统中,当一个操作完成后,不同节点上的数据可能会有一段时间内不一致的情况,但是最终会达到一致的状态。这种一致性模型可以在数据副本之间提供高可用性和可扩展性,并减少系统复杂度。
在半一致性模型中,不同节点上的数据可能会在某个时间点不一致,但是这种不一致的情况会在一段时间后自动解决。具体来说,当一个节点更新了数据后,其他节点可能不会立即得到这个更新,但是随着时间的推移,其他节点也会逐渐得到更新,直到最终所有节点上的数据都达到了一致的状态。
半一致性模型是一种常见的分布式系统一致性模型,它可以在保证数据的最终一致性的同时提供高可用性和可扩展性。
二、mysql的半一致性读
2.1 MySQL的半一致性读
mysql的半一致性读是一种用在 Update 语句中的读操作(一致性读)的优化,是在 RC 事务隔离级别下与一致性读的结合;在 RC 事务隔离级别下或者是设置了 innodb_locks_unsafe_for_binlog=1(在 8.0 版本中已被去除) 的情况下才会发生。
-
对于UPDATE或DELETE语句,InnoDB只对其更新或删除的行持有锁。在MySQL评估WHERE条件后,释放不匹配行的记录锁。这大大降低了死锁的概率,但它们仍然可能发生。
-
对于UPDATE语句,如果一行已经锁定,InnoDB将执行“半一致”读取,将最新提交的版本返回给MySQL,以便MySQL可以确定该行是否符合UPDATE的WHERE条件。如果行匹配(必须更新),MySQL将再次读取该行,这次InnoDB要么锁定该行,要么等待锁定。
2.2 为什么delete不支持半一致性读
在MySQL中,DELETE操作会引起数据的实际删除,因此在执行DELETE操作时,如果使用半一致性读,可能会导致数据的不一致性和丢失。具体来说,如果在一个从服务器上执行DELETE操作,而主服务器上的数据已经被更新,但是从服务器还没有接收到更新,那么执行DELETE操作就会删除主服务器上的数据,而不会删除从服务器上的数据,导致数据的不一致性。此外,如果主服务器上的数据已经被删除,而从服务器还没有接收到删除操作,那么执行DELETE操作就会导致数据在主从服务器上的不一致,导致数据的丢失。
因此,为了避免这些问题,DELETE操作通常不支持半一致性读,必须在主服务器上执行才能确保数据的一致性。如果需要在从服务器上执行DELETE操作,可以使用其他的一致性模型,例如强一致性或者单调读一致性。
以上是关于MySQL的半一执行读的主要内容,如果未能解决你的问题,请参考以下文章