锁模式

加锁流程
首先加事务Exclusive锁 行锁等到事务提交才会释放,其他事物如果等待这个行锁,必须等待这个事务锁释放。以Update为例,首先分配一个事务xid,这个时候会对事务xid加锁,AssignTransactionId->AssignTransactionId->LockAcquire,这个锁是个内存锁 判断是否需要锁等待 如果一个tuple被修改或者删除后,会记录xmax和t_infomask,ExecUpdate->heap_update->HeapTupleSatisfiesUpdate会返回tuple状态,只有当前Tuple上的Xmax或者MultiXactId还在活跃事务列表,会进行锁等待

加tuple锁 tuple锁可以保证多个修改事务加锁的顺序问题,原则是先来先拿锁,修改完tuple后,tuple锁会立即释放,而事务锁不会释放。假设有3个事务,A、B、C依次对同一行修改,均未提交,这个时候,A处于idle in transaction状态,B持有tuple锁但是等待A的事务锁,C等待B持有的tupe锁。调用函数为ExecUpdate->heap_update->heap_acquire_tuplock 等待Xmax事务Share锁 等待事务锁之前,需要释放page锁,这样不会阻塞当前page上其他tuple的访问。调用函数ExecUpdate->heap_update->XactLockTableWait,其他事务commit或者abort后,等待事务会被唤醒,这个时候需要重新检查tuple上的xmax是否发生变化,如果发生变化,需要等待新的xmax事务提交。
MultiXact

总结
PostgreSQL中文社区欢迎广大技术人员投稿
投稿邮箱:press@postgres.cn
文章转载自PostgreSQL中文社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




