上一节《Oracle基础架构:一条SQL查询语句是如何执行的》我们讲到了SQL查询语句在数据库中的执行过程,因为不涉及到数据的变更,因此其执行过程相对来说比较简单,所以我重点给大家介绍了SQL语句的解析过程。但数据库里不仅仅只有查询,还会有大量的变更操作。
关系型数据库中的变更操作主要有insert/update/delete,以及后来扩展出来的merge。虽然在数据写入的实现细节上有所差别,但在数据库内部的操作方式和数据流向上并没有太大的差别,为了让我们的讲述更加完整,本篇文章里我选择一条更新语句来给大家介绍,Oracle数据库是如何实现数据变更操作的。
更新语句也是SQL语句,因此我们在上一节讲到的SQL解析等过程也同样需要。不同的是,查询语句是只读的,不涉及数据的变化,因此将用户需要的数据返回到客户端,即完成了这次查询操作;但更新语句涉及到数据的变化,因此需要将用户的变更操作保存下来,实现的过程比单纯的查询语句要复杂很多。
Oracle的日志系统
关系型数据库操作需要满足ACID理论要求,其中D(Durability)持久性就是指一旦事务提交,数据库就要绝对保证数据的安全,任何情况下都不会丢失数据。因为我们的数据库是一个并发的系统,既要满足性能上的极致追求,又必须在各种极端情况下确保数据的持久性,看似是一个非常朴素的需求,却凝聚了很多精妙的设计。
Oracle的日志系统主要是由日志缓冲区(Redo Log Buffer)、在线日志(Redo Log)以及组成归档日志(Archived Log)&