面试题答案
一键面试数据更新操作
- 存储结构影响:
- Zheap是PostgreSQL 11引入的一种新存储格式,对于更新操作,Zheap并不会像传统Heap那样在原位置直接修改数据。而是采用了多版本并发控制(MVCC)机制。当一条记录被更新时,会在页面上创建一个新的版本,原版本并不会立即删除。
- 页面结构上,新的版本记录会被添加到页面中合适的位置,页面的空闲空间管理会随之调整,以容纳新的记录版本。如果页面空间不足,可能会触发页面分裂,将部分记录移动到新的页面。
- 事务处理:
- 事务开始时,会获取一个事务ID(XID)。在更新操作过程中,新生成的记录版本会标记上当前事务的XID作为其创建XID(ctid),同时原版本会标记删除标志,并记录删除它的事务的XID作为删除XID(xmax)。
- 只有当事务提交时,这些更新操作才会被持久化。如果事务回滚,新生成的记录版本会被忽略,原版本的删除标记也会被撤销。
- 并发控制策略:
- 基于MVCC,不同事务可以同时读取数据而不会相互阻塞。当一个事务进行更新操作时,其他并发的读事务可以读取到旧版本的数据,只要旧版本没有被标记为对读事务不可见(根据事务ID的可见性规则判断)。
- 写操作之间会存在一定的同步机制。例如,当多个事务尝试更新同一页面时,需要通过页面级的锁机制来保证同一时间只有一个事务能够修改页面结构,防止数据损坏。
数据删除操作
- 存储结构影响:
- 在Zheap中执行删除操作时,同样不会立即从存储中物理删除数据。而是标记记录为已删除,原记录仍然保留在页面上。
- 被标记删除的记录占用的空间不会立即释放,而是被标记为空闲空间。后续如果有新的记录插入且大小合适,可以复用这些被标记删除记录占用的空间,从而提高空间利用率。
- 事务处理:
- 与更新操作类似,删除操作也会关联事务ID。事务开始删除记录时,将记录的删除XID设置为当前事务的XID。
- 只有事务提交后,删除操作才会真正生效(从逻辑上)。若事务回滚,删除标记会被撤销,记录恢复为未删除状态。
- 并发控制策略:
- 读事务在读取数据时,会根据事务ID的可见性规则跳过被标记删除的记录(如果删除事务已经提交)。
- 写事务在进行删除操作时,同样需要获取页面级的锁,以确保在同一时间只有一个事务能够对页面上的记录进行删除标记等操作,避免并发删除导致的数据一致性问题。