大数据比赛网站建设,app开发公司怎么学东西,丰台网站制作公司,有哪些做网站的公司好专栏内容#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页#xff1a;我的主页 座右铭#xff1a;天行健#xff0c;君子以自强不息#xff1b;地势坤#xff0c;君子以厚德载物.
表锁介绍 当表打开#xff0c;或者操作表时#xff0c;都需要… 专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 个人主页我的主页 座右铭天行健君子以自强不息地势坤君子以厚德载物. 表锁介绍 当表打开或者操作表时都需要对表relation 进行加锁表锁定义了8种级互斥级别另外还有会话级表锁 session lock。 表锁的标识
锁类型 LOCKTAG_RELATIONlocktag的取值 locktag_field1 dboid 当relation 为共享表时 dboid 0 locktag_field2 reloid 表锁相关接口
extern void LockRelationOid(Oid relid, LOCKMODE lockmode);
extern void LockRelationId(LockRelId *relid, LOCKMODE lockmode);
extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode);
extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode);
extern void UnlockRelationOid(Oid relid, LOCKMODE lockmode);extern void LockRelation(Relation relation, LOCKMODE lockmode);
extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode);
extern void UnlockRelation(Relation relation, LOCKMODE lockmode);
extern bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode,bool orstronger);
extern bool LockHasWaitersRelation(Relation relation, LOCKMODE lockmode);extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);
extern void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);表锁申请方式 表锁的申请有两种首先打开表时锁定系统字典中的记录然后再对目标表加锁 当然在加锁时会检查系统字典变更在postgresql 就是通过invalidmessage来同步变更 实际调用LockAcquireExtended如果获得表锁后首先进行invalidmessage同步处理 首次打开表时
表的OID作为参数 接口有 LockRelationOid,ConditionalLockRelationOid,UnlockRelationOid 实际调用LockAcquireExtended 用于打开表时锁定relcache中的数据 表relid作为参数 接口有 LockRelationId UnlockRelationId 实际调用LockAcquireExtended获取锁 用于打开表时锁定表 解锁时UnlockRelationId比UnlockRelationOid速度要快建议用前者 再次加表锁时
locktag使用 relation结构初始化 接口有 LockRelation ConditionalLockRelation UnlockRelation 此时表已经 open 实际调用LockAcquireExtended加锁时也需要检查invalidate message。 用途 在访问表、索引时先是open处理 调用关系 表的打开和关闭调用关系 table_open-relation_open-LockRelationOid
table_close-relation_close-UnlockRelationId索引的打开和关闭调用关系 与表是类似的 index_open-relation_open-LockRelationOid
index_close-relation_close-UnlockRelationId会话锁的操作 会话锁与当前会话相关也就是锁的持有可以跨多个事务 释放时调用接口释放 或者当会话结束时会自动释放或者是发生了ERROR级别的错误也会自动释放。 接口 LockRelationIdForSession 申请和 UnlockRelationIdForSession 释放 其中调用 LockAcquire来获取常规锁其实也是LockAcquireExtended的也一个包装固定了最后两个参数 会话锁的入参 LockRelId 指定了dbid, relid; 会话锁的用途
创建索引 在concurrent 方式创建索引时会再次加session lock 删除索引 drop index重建索引 reindex清理表 vacuum
结尾 非常感谢大家的支持在浏览的同时别忘了留下您宝贵的评论如果觉得值得鼓励请点赞收藏我会更加努力 作者邮箱studysenllang.onaliyun.com 如有错误或者疏漏欢迎指出互相学习。
注未经同意不得转载