OceanBase 数据库的 PL 代码仅支持编译执行。本文主要介绍 PL 引擎与 OBServer 和 SQL 引擎间的执行机制。
编译执行相对于解释执行有更好的性能优势。尤其是在 PL 引擎内部计算元素比较多的场景下,性能提升会更加明显。
在编译执行的框架下,PL 源代码会被直接编译为对应平台的可执行代码。PL 引擎执行时,OBServer 直接调用编译好的可执行代码。同时编译好的 PL 代码会被缓存在 PL 缓存中,因此同一个 PL 代码仅需要编译一次。

PL 代码在定义时被存储在 OBServer 中,当应用程序调用存储过程时,OBServer 首先从数据字典中读取 PL 代码的定义,然后将 PL 代码定义编译为可执行的二进制代码,将编译好的 PL 二进制代码存储进 PL 缓存。执行时 PL 引擎从 PL 缓存获取可执行代码,配合 SQL 引擎完成 PL 代码的执行。
存储过程间可以嵌套调用,例如当前 PL 块可以调用另外的存储过程。
数据库事务包含了数据库上的一系列操作,事务使得数据库从一个一致的状态转化到另一个一致的状态。
数据库事务有两个作用:
为数据库操作序列提供一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
为数据库的多个并发访问提供隔离的方法,避免多个并发操作导致数据库进入一个不一致的状态。
数据库事务具有 4 个特性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。
原子性
OceanBase 数据库是一个分布式系统,分布式事务操作的表或者分区可能分布在不同机器上,OceanBase 数据库采用两阶段提交协议保证事务的原子性,确保多台机器上的事务要么都提交成功要么都回滚。
一致性
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性
OceanBase 数据库社区版支持 MySQL 兼容模式。在 MySQL 模式下,支持 Read Committed 隔离级别、 Repeatable Read 隔离级别和 Serializable 隔离级别。
持久化
对于单个机器来说,OceanBase 数据库通过 redo log 记录了数据的修改,通过 WAL 机制保证在宕机重启之后能够恢复出来。保证事务一旦提交成功,事务数据一定不会丢失。对于整个集群来说,OceanBase 数据库通过 paxos 协议将数据同步到多个副本,只要多数派副本存活事务数据一定不会丢失。




