postgresql 内核源码分析 表锁relation lock的使用,session lock会话锁的应用场景,操作表不再困难

专栏内容
postgresql内核源码分析
手写数据库toadb
并发编程
个人主页:我的主页
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

==================================================================

表锁介绍

当表打开,或者操作表时,都需要对表relation 进行加锁,表锁定义了8种级互斥级别,另外还有会话级表锁 session lock。

表锁的标识

  • 锁类型 LOCKTAG_RELATION
  • locktag的取值

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

结尾

非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/29691.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用案例|探索高精度3D机器视觉在车间滑橇检测与测量中的应用

Part.1 应用行业 随着科技的不断进步,3D机器视觉技术逐渐成为了现实世界与数字世界之间的桥梁。3D机器视觉技术能使计算机感知和理解三维空间重的物体和场景,被广泛应用于机器人引导、工业检测等行业,例如:物流、电商、教育、医疗…

知识图谱推理的学习逻辑规则(上)

知识图谱推理的学习逻辑规则 摘要介绍相关工作模型知识图谱推理逻辑规则概率形式化参数化优化 实验实验设置实验结果 结论 原文: 摘要 本文研究了在知识图谱上进行推理的学习逻辑规则。 逻辑规则用于预测时提供了可解释性并且可以推广到其他任务中,因…

【Ceph集群应用】Ceph块存储之RBD接口详解

Ceph块存储之RBD接口详解 1.创建Ceph块存储系统RBD接口1.1 删除镜像1.2 还原镜像1.3 在线扩容1.4 回滚镜像到指定位置1.5 删除快照1.6 快照分层1.7 快照展平1.8 镜像的导出导入 接上文基于ceph-deploy部署Ceph集群详解 1.创建Ceph块存储系统RBD接口 (1)…

Godot实用代码-存取存档的程序设计

1. Settings.gd 全局变量 用于保存玩家设置 对应Settings.json 2. Data.gd 全局变量 用于保存玩具数据 对应Data.json 实践逻辑指南 1.在游戏开始的时候(游戏场景入口的_ready()处, Settings.gd

【源码解析】Mybatis执行原理

Mybatis执行原理 1.获取SqlSessionFactory2.创建SqlSession3.创建Mapper、执行SQL MyBatis 是一款优秀的持久层框架,MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和…

密码学学习笔记(十二):压缩函数 - Davies–Meyer结构

密码学中压缩函数是指将输入的任意长度消息压缩为固定长度输出的函数。压缩函数以两个特定长度的数据为输入,产生与其中一个输入大小相同的输出。简单来说就是它接受一些较长的数据,输出更短的数据。 压缩函数接收长度为X和Y的两个不同输入,并…

输入 jar cvf 后指令提示‘jar‘ 不是内部或外部命令,也不是可运行的程序

输入 jar cvf 后指令提示jar 不是内部或外部命令,也不是可运行的程序 一堆说jdk系统环境配置的文章,我都看哭了,还好有这位老兄拯救了我!!!献上地址 https://www.cnblogs.com/wadezhou/p/16647474.html 我输…

[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

初级的操作就是CRUD,但是高级的操作也是CRUD,只是语句写的更加复杂,不再是select * from table;这样简单,这次咱们学一些稍微高级点的。下面是上一篇文章。 [SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇,前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型,各个文章总有些小不同,我们这里讨论的是Redis 7.0,为确保准确&#xf…

字幕切分视频

Whisper 仓库地址: https://github.com/openai/whisper 可用模型信息: 测试视频:18段,总共447S视频(11段前:有11段开头有停顿的视频) Tiny: 跑完:142S ,11段前&#xf…

在线乞讨系统 Docker一键部署

begger乞讨网 在线乞讨 全球要饭系统前端界面后端界面H2 数据库 console运行命令访问信息支付平台 在线乞讨 全球要饭系统 在线乞讨全球要饭项目,支持docker一键部署,支持企业微信通知,支持文案编辑 前端界面 后端界面 H2 数据库 console 运行命令 项…

PID算法

PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。 需要将一个物理量保持在稳定状态(比如维持平衡,温度、转速的…