一、问题的提出
一个操作执行select * from tb_trade_record where product_type = ‘BOOK’语句,假设表tb_trade_record初始时有1000000行数据,整个select过程持续10分钟。会话1在8:00发起这个select操作(这时,满足product_type = ‘BOOK’的记录有10000条),8:02时,会话2向tb_trade_record表中插入了2条数据,且product_type = ‘BOOK’,并且已提交,会话1在8:10读取完毕。那么,会话1读出的记录是10000条,还是10002条?
二、什么是一致性读
关于上述问题的解答如下:
答案是:10000条,因为会话1是在8:00发起的,select操作应该从8:00那一刻的数据库快照中读取tb_trade_record表满足条件满足 product_type = ‘BOOK’的数据,而不论读取操作花多少时间,期间数据发生什么变化。因此不是读取结束8:10时的数据,更不是其他中间时刻的数据。所以,上述问题的答案是10000。
读取操作发起的那一刻是8:00,整个读取操作应该都是从8:00那一刻的数据库快照中读取数据,这就是一致性读或者快照读。
三、Mysql与Oracle一致性读的实现
1.Mysql一致性读的实现(InnoDB存储引擎)
在每一行记录的后面保存两个隐藏的列实现一致性读。一列保存行的创建时间或者说是系统版本号,另外一列保存的是该行过期(删除)时的时间或者系统版本号。每次开启一个新事务时,系统版本号就会递增,事务开启时刻的系统版本号就是该事务的版本号。
针对SELECT、INSERT、DELETE、UPDATE操作的具体实施如下:
SELECT:
InnoDB会根据以下条件检查每行记录:
a.查找版本号小于等于当前事务的系统版本号,这样确保当前事务读取的行是在当前事务开启前已经存在,或者当前事务插入或者修改过的数据。
b.行删除时的版本要么没有,要么大于当前事务的版本号(不能等于,等于表示是当前事务删除的),这样确保当前事务读取到的行在当前事务开始之前还没有被删除。
INSERT:
新插入的行将当前事务的系统版本号作为该行的版本号。
DELETE:
删除的行保存当前事务的系统版本号作为该行的版本号。
UPDATE:
update时插入一行新记录,保存当前事务的系统版本号作为该行的版本号,同时保存当前事务的系统版本号作为原来行的过期时的系统版本号。
保存两个隐藏的列数据,使得大多数读操作都可以不用加锁,这样读操作简单,并发性能好,不用锁表,保证只会读取到符合要求的行。
2.Oracle一致性读的实现
a.块中记录SCN(system change number),scn是一个只增不减的数字,每行记录就存储在块中。当块的内容改变,scn就会增加。
b.块提供ITL(interested transaction list),如果更新了某条记录,该更新操作对应的事务就会被写进该记录所在块的itl中,如果事务没有提交或者回滚了,则块中就存在活动事务,数据库可识别出这种情况。
Oracle基于scn和itl来实现一致性读。
四、相同点与差异
1. 相同点:
Mysql基于每行数据的创建时系统版本号和删除时系统版本号来实现一致性读;Oracle基于scn和itl来实现一致性读。虽然名称及实现方式不一样,但是它们都是实现MVCC(Multi-Version Concurrency Control多版本并发控制)。MVCC在很多情况下避免了加锁操作,实现非阻塞的读,提高并发操作的性能。它的实现是通过保存数据在某个时间点的快照来实现,不管读取操作执行多长时间,每个事务看到的数据都是一致的。
a.都是将一行数据与另外一个或者两个数据关联起来,Mysql是在一行记录中增加两个隐藏列,一个是创建时版本号,一个是删除时版本号;Oracle通过在行记录所在的逻辑块(oracle的数据文件由若干个tablespace组成,一个tablespace由若干个segment组成,一个segment由若干个extent组成,一个extent由若干个block组成,数据表的每行记录就是存储在block里面)中,在这个块中除了保存数据记录外,还保存和这个记录相关的scn和itl,这样一行数据记录就和scn、itl关联起来。
b.都是通过比较一个数字来进行是否需要读取该行数据的。Mysql通过比较创建时系统版本号来判断,Oracle通过比较scn来判断。如果读取期间发生了删除或者更新,Mysql使用删除时系统版本号找到之前的记录,oracle通过itl来在undo日志里面找到前记录。
c.都需要额外的存储空间来存储额外的字段。
2. 差异:
a. 系统设计上的差异:Mysql是直接在一行数据内记录版本号,Oracle在数据内容外记录,然后再与内容关联起来。
b.对于查找期间,删除或者更新记录的前记录的查找凡是不同。更新或者删除时,Mysql是新增一条记录,设置原纪录的删除版本号。Oracle删除时是在undo日志里面记录反向的update操作或者insert操作,因此查找更新或者删除的记录的方式不同
五、总结
Mysql和Oracle都实现了基于MVCC的一致性读,实现方式不同,但目的相似,替代锁操作,提高了并发操作性能。
Mysql(InnoDB存储引擎)实现MVCC,但只能在REPEATABLE READ(解决不可重复读) 和READ COMMITTED(解决脏读)两个隔离级别下工作。
Oracle是在其逻辑体系结构(tablespace、segment、extent、block)的基础上实现的一致性读。
六、参考
1. 《高性能MySQL》,电子工业出版社
2. 《收货,不止Oracle》,电子工业出版社
相关推荐
- 在实际生产环境迁移前,应在测试环境中进行完整迁移并验证数据一致性。 11. **风险与备份**: - 数据迁移总是伴随着数据丢失的风险,因此在迁移前后都应做好数据库备份。 12. **Readme-说明.htm**: - 这个...
- 考虑到MySQL与Oracle在某些方面的差异,可能需要对SQL语句进行优化调整。 - 如有必要,还可以考虑对MySQL服务器的配置进行适当调整,以提高迁移后的系统性能。 3. **备份与恢复策略**: - 在进行迁移之前,...
6. **事务处理**:确保数据的一致性,转换工具在迁移过程中可能需要使用事务来处理批量操作。 7. **兼容性和适配性**:转换工具需要处理不同版本的MySQL和Oracle之间的差异,确保在各种环境下的正常工作。 8. **...
两者之间的相同点在于,MySQL 和 Oracle 都是关系型数据库,遵循ACID(原子性、一致性、隔离性和持久性)原则,支持SQL语言,用于存储、管理和检索结构化数据。它们都是目前市场上最流行的选择。 两者的区别主要...
MySQL到Oracle的数据迁移是一项常见的任务,特别是在企业级应用中,由于业务需求或系统升级,可能需要将数据从MySQL数据库迁移到Oracle数据库。本篇文章将详细探讨这个过程中的关键知识点,包括ETL(提取、转换、...
【MySQL 迁移 Oracle 知识点详解】 MySQL 和 Oracle 是两种广泛应用的关系型数据库管理系统,它们各有特点,但在特定情况下,可能需要将 MySQL 的数据迁移到 Oracle 数据库中。以下是一份详细的步骤指南,帮助您...
在面试中,面试官可能会询问关于MySQL的一些基础问题,如数据库的ACID特性(原子性、一致性、隔离性和持久性)、存储引擎(InnoDB、MyISAM等)的区别,以及触发器、存储过程的使用等。理解索引的工作原理,特别是B-...
在数据库管理领域,数据迁移是一项常见的任务,尤其是在不同的数据库系统之间...通过学习和理解这些转换技巧,数据库管理员和开发人员能够更顺利地进行Oracle到MySQL的迁移工作,确保数据的一致性和应用的无缝对接。
7. **数据一致性**:由于MySQL和Elasticsearch的数据模型不同,可能需要在转换过程中处理一些数据类型和结构的差异,以保证数据的一致性。 8. **实时同步与定时同步**:根据需求,可以选择实时同步(通过监听MySQL...
3. **创建MySQL表结构**:在MySQL中,创建与SQL Server相同结构的表。这可以通过执行修改后的SQL脚本来完成,或者使用MySQL Workbench等工具直接设计和创建。 4. **导入数据**:一旦表结构建立好,可以将数据导入到...
2. **元数据转换**:Oracle与MySQL的数据库架构存在差异,Yugong工具能识别并处理这些差异,自动转换表结构、索引、触发器、存储过程等元数据,确保目标数据库与源数据库的兼容性。 3. **数据类型映射**:Oracle和...
- 在进行数据库升级的同时,需要特别注意数据迁移的完整性和一致性,确保所有数据被正确地传输到新的环境中。 - 对于应用程序代码,也需要进行相应的调整和测试,以确保其兼容新版本的数据库。 - 性能调优是迁移后的...
尽管SQL是大多数数据库系统中的通用查询语言,但Oracle在其实现上具有一些独特的特性,这使得它与其他数据库(如MySQL、SQL Server等)有所不同。 - **SQL标准支持**:虽然Oracle支持SQL标准中的大部分功能,但在...
根据提供的文件信息,我们可以整理出一系列关于MySQL的关键知识点,这些知识点涵盖了从基本概念到特定功能的使用,旨在帮助读者更好地理解和应用MySQL。 ### 1. 自增主键的行为 - **MyISAM表**: 当插入了17条记录...
- PDO提供了数据库访问的一个通用接口,可以使用相同的函数来访问不同数据库,从而提高了代码的可移植性。 2. 数据库连接: - 使用PDO进行数据库操作时,首先需要创建一个PDO实例。 - PDO的构造函数需要一个DSN...
在IT领域,这种工具对于数据库管理员、数据分析师以及开发者来说非常有用,因为它们能够高效地处理大量的数据,并确保在转换过程中的数据完整性和一致性。 在标题"数据转换小工具"中,我们可以理解这个工具的主要...
总之,掌握如何用C#进行数据库表结构比较是一项重要的技能,它能帮助我们在数据库管理和维护中确保数据的一致性和准确性。无论是开发新的应用程序、升级现有系统还是进行数据库迁移,这种能力都是必不可少的。通过...