0. Resource Owners(资源所有者)
ResourceOwner对象是为了简化与查询相关的资源(如缓冲引脚和表锁)的管理而发明的一个概念。需要以可靠的方式跟踪这些资源,以确保它们将在查询结束时被释放,即使查询由于错误而失败。我们没有期望整个执行器都具有万无一失的数据结构,而是将这些资源的跟踪定位到单个模块中。
ResourceOwner API的设计以MemoryContext API为蓝本(模型),该API已被证明在防止内存泄漏方面非常灵活和成功。特别是,我们允许ResourceOwner有子ResourceOwner对象,这样就可以有很多的东西;释放父类ResourceOwner也会作用于它的所有直接和间接子类。
(考虑将ResourceOwners和MemoryContexts统一为一个对象类型是很有诱惑力的,但是它们的使用模式有很大的不同,这样做可能没有什么帮助。)
我们为每个事务或子事务以及每个Portal创建一个ResourceOwner。在执行门户期间,全局变量CurrentResourceOwner指向Portal的ResourceOwner。
这将导致ReadBuffer 和LockAcquire 等操作在ResourceOwner 对象中记录所获取资源的所有权。
当Portal 关闭时,任何剩余的资源(通常只有锁)都将由当前事务负责。这可以通过将Portal的ResourceOwner作为当前事务的ResourceOwner的子元素来表示。 resowner.c在释放子对象时自动将资源转移到父对象。类似地,子事务ResourceOwners 是其直接父事务的子事务。
我们需要与事务相关的ResourceOwners 以及与Portal相关的ResourceOwners ,因为当还没有关联的Portal