老师,请教下,Ob在线ddl时会对表加哪些锁
在执行 DDL 操作时,OceanBase 数据库会采取以下措施来保证数据的一致性和并发性:
-
Schema 刷新机制:在 DDL 发生后,Root Server 会通知集群中的每一个节点最新的 Schema Version。各节点在接收到新的 Schema Version 后,会与本地缓存的 Schema Version 进行比对,如果发现本地版本落后于全局版本,则会从系统表中获取变更信息来更新本地缓存的系统对象信息。这一过程称为刷新 Schema。此外,每个节点还会在后台定期对比 Schema Version,如发现落后也会自动触发刷新 Schema。这一机制确保了所有节点上的 Schema 信息是一致的,从而避免了因 Schema 不一致导致的数据问题。(来源:文档片段 9)
-
行级锁:虽然 OceanBase 社区版不支持表锁,但在某些情况下,如执行 SELECT … FOR UPDATE 语句时,仍然会使用行级锁来确保数据的一致性。例如,在事务中执行 SELECT … FOR UPDATE 时,会为选中的行加上行锁,所有并发的更新操作都会被阻塞并等待,直到当前事务结束。(来源:文档片段 4 和 8)
-
多版本两阶段锁:OceanBase 数据库使用了多版本两阶段锁来维护其并发控制模型的正确性。在大多数情况下,读取操作是不上锁的,因此可以做到读写不互斥,从而提高并发能力。但是,SELECT … FOR UPDATE 无法做到读写不互斥,会加上行锁并与修改或 SELECT … FOR UPDATE 产生互斥与等待。另外,在事务提交过程中,为了维护事务的一致性快照,会有短暂的读写互斥,这被称为 lock for read。(来源:文档片段 8 和 10)
综上所述,在 OceanBase 社区版中,虽然没有表锁,但通过行级锁、多版本两阶段锁以及 Schema 刷新机制,仍然能够有效地保证 DDL 操作期间的数据一致性和并发性。
谢谢老师的指导,我这边详细看看,感谢!