各位好,
最近在看opengauss代码,有个关于两阶段锁的疑问,DDL应该是遵守两阶段锁的,我的理解应该用的是spinlock,lwlock,regularlock中的regularlock,
我调试了一个例子:create table t1 (a int)
按照我的理解:代码中应该先调用LockAcquire,并且LockAcquire之间没有LockRelease调用。
但是实际上,LockAcquire之间有LockRelease,LockRelease后又有LockAcquire调用。
这样是不是不符合两阶段锁协议?还是我的理解有问题。
另外还有一个问题,PG在DDL时,也多次调用LWLockAcquire和LWLockRelease,也并没有遵守两阶段协议,
代码中访问共享的数据结构时(如获取事务id),LWLockAcquire后,读写完就LWLockRelease了,也并不遵守两阶段协议,
而我的理解,应该是DDL事务中,读写所有对象的加锁(例如对锁表的增删操作本身也需要锁吧),都应该遵守2PL,才能保证DDL的一致性。
还是我的理解有问题,只要对核心对象的访问遵守2PL,其它对象只要保证单个对象访问的原子性就可以了?这个地方我有点迷惑
新大陆软件 秦浩 mobile: 17625988619 e-mail:qinhao@newland.com.cn