微信做网站网站,上海营销型网站代理,视频拍摄设备,海南省住房和城乡建设厅官网网站首页目录 前言知识点一个例子 前言
快照读#xff08;Snapshot Read#xff09;是数据库管理系统中一种特殊的读取机制#xff0c;主要用于实现多版本并发控制#xff08;MVCC, Multi-Version Concurrency Control#xff09;策略#xff0c;尤其是在MySQL的InnoDB存储引擎中… 目录 前言知识点一个例子 前言
快照读Snapshot Read是数据库管理系统中一种特殊的读取机制主要用于实现多版本并发控制MVCC, Multi-Version Concurrency Control策略尤其是在MySQL的InnoDB存储引擎中。其核心目的是在高并发环境下提供一致性的非锁定读取以提高读操作的性能。
知识点
先来张图 多版本并发控制MVCCMySQL InnoDB 引擎使用MVCC来管理事务并发时的数据版本。每个事务看到的数据是由其开始时数据库状态的快照组成而不是最新的数据状态。如此以来事务之间就不会因为读操作而相互阻塞。 事务ID与版本号每当一个新的事务开始时MySQL会分配给它一个唯一的事务ID。在执行更新操作时InnoDB不会直接修改原有数据行而是将更改保存在新的记录中并标记新记录的事务ID或版本号同时保留旧版本的记录。 Undo Logs回滚日志为了支持快照读InnoDB使用Undo Logs来保存数据的旧版本。当事务需要查看某个数据的历史版本时可以通过Undo Logs回滚到该事务开始时的数据状态。 Read View读视图在可重复读Repeatable Read隔离级别下事务第一次执行快照读操作时会创建一个Read View。这个Read View记录了当前活跃事务的列表以及它们的事务ID。之后的快照读都将依据这个Read View来决定数据的可见性事务能看到所有在它之前提交的事务所做的更改但看不到在其之后开始的事务所做的更改。 数据可见性判断在进行快照读时会根据Read View和Undo Logs来判断数据的可见性。如果数据的最新版本是由一个在当前事务启动后才开始的事务所修改的则会通过Undo Logs回溯到该数据的一个旧版本确保读取的是一个一致性的视图。 隔离级别影响在不同的事务隔离级别下快照读的行为有所不同。例如在读已提交Read Committed隔离级别下每次快照读都会创建一个新的Read View而在可重复读Repeatable Read级别下整个事务周期内只创建一个Read View。
通过这些机制快照读使得事务能够在不加锁的情况下读取数据降低了锁的竞争提高了系统的并发性能同时也保证了事务间的隔离性和数据一致性。
一个例子
假设我们有一个表users包含两列id和name初始数据如下
idname1Alice2Bob
假设有两个并发事务T1和T2 事务T1开始事务T1开始执行此时MySQL为T1分配了一个事务ID假设为100。 T1执行快照读T1想要读取用户Alice的信息由于这是T1的第一次读操作InnoDB为T1创建一个Read View。此时没有其他活动事务所以Read View中记录的活跃事务列表为空。 事务T2开始并更新数据接着事务T2开始事务ID为200T2决定将Alice的名字改为Carol并提交这个更改。InnoDB不会直接覆盖原记录而是创建一个新的版本记录标记其由事务200修改同时保留原始记录Alice作为Undo Log的一部分。 T1再次执行快照读现在T1再次读取用户Alice的信息。由于T1已经有了自己的Read View里面没有活动事务ID大于100的事务它不会看到T2所做的更改。InnoDB通过Undo Logs回滚到T1开始时的状态因此T1看到的仍然是Alice而不是Carol。这就是快照读的效果——T1看到的是一个一致性的数据视图仿佛T2的更改从未发生过。
在这个例子中快照读确保了事务T1在多次读取同一条记录时结果保持一致即“可重复读”同时避免了T1和T2之间的读写冲突提高了并发处理能力。