一致性非锁定读取 Consistent Nonlocking Reads 目录正文一、一致读取的规则二、触发一致读取的语句三、可重复读下的一致读取四、避免一致读取的弊端五、DDL、select子句对一致读取的适用性六、到底什么叫数据库多版本并发控制 正文开始前,先把概念讲明白: 一致性读取(consistent read): 一种读取操作,使用基于时间点的快照(snapshot )展示查询结果,而不管同时运行的其他事务执行的更改如何。 如果查询的数据已被另一个事务更改,则将基于撤消日志(undo log)的内容来重建原始数据。 运用这项技术,可以缓解由锁导致的事务间的等待而降低并发性能的问 一致性非锁定读取是InnoDB存储引擎在处理事务时采用的一种优化策略,它允许查询在不加锁的情况下读取数据,从而提高了系统的并发性能。在MySQL中,这主要体现在两个事务隔离级别——可重复读(REPEATABLE READ)和读已提交(READ COMMITTED)。 **一、一致读取的规则** 一致性读取遵循以下原则: 1. 一个查询只能看到在它开始时已经提交的数据,即在查询时的时间点之前的数据。这确保了事务的隔离性。 2. 在同一个事务内,如果第一次查询后有新的更改,那么在后续的查询中可以看到这些更改,即使这些更改尚未提交。这是可重复读事务的特点,使得在同一事务内的多次查询结果保持一致。 **二、触发一致读取的语句** 任何不使用`FOR UPDATE`或`LOCK IN SHARE MODE`的`SELECT`语句都会触发一致性非锁定读取。例如: ```sql SELECT * FROM table_name; ``` **三、可重复读下的非锁定读取** 在可重复读隔离级别下,事务在开始时创建一个时间点的快照,整个事务期间都将基于这个快照读取数据。这意味着在此事务中进行的多次查询将始终看到相同的结果集,不受其他并发事务的影响。即使其他事务插入、更新或删除了数据,这些更改在这个事务内是不可见的。 **四、避免一致读取的弊端** 一致性非锁定读取虽然提高了并发性,但也存在潜在问题。例如,幻读(Phantom Read)现象可能发生,即在可重复读事务内,两次查询可能返回不同的行集,因为其他事务在两次查询之间插入了满足查询条件的新行。InnoDB通过Next-Key Locks来解决这个问题,防止幻读的出现。 **五、DDL、select子句对一致读取的适用性** DDL语句(如`CREATE`, `ALTER`, `DROP`等)通常会隐式地锁定表,因此不适用于一致性非锁定读取。而`SELECT`语句,尤其是不带锁定的`SELECT`,则可以利用一致性非锁定读取来提高效率。某些特定的`SELECT`子句,如`SELECT ... INTO OUTFILE`,可能会触发锁定行为,具体取决于MySQL的实现和配置。 **六、数据库多版本并发控制(MVCC)** 多版本并发控制是InnoDB实现一致性非锁定读取的基础。每个事务看到的数据版本是由事务开始时的系统版本号决定的。每个被修改的行都保存了多个版本,旧版本存储在撤销日志(undo log)中,直到不再需要为止。当事务需要访问旧数据时,可以从undo log中恢复。 总结来说,InnoDB的一致性非锁定读取是一种高效且并发友好的读取策略,它通过MVCC机制和撤销日志保证了事务的隔离性和一致性,同时减少了锁的使用,提高了系统的并行处理能力。然而,了解其工作原理和潜在问题对于正确设计和优化数据库应用程序至关重要。
- 粉丝: 4
- 资源: 929
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0