李老师,有个问题想请教一下,按照《数据库事务处理的艺术》所说,PG的DDL使用两阶段锁,而PG中有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,其它对象只要保证单个对象访问的原子性就可以了?这个地方我有些迷惑。
谢谢!