2-4.pg特性功能之咨询锁,sql med介绍和使用

PostgreSQL 特性功能:咨询锁与 SQL/MED 介绍

什么是咨询锁(Advisory Lock)

简介

PostgreSQL 允许创建由应用定义其含义且与数据库本身无关的锁,这种锁被称为咨询锁(Advisory Lock)。

与使用 SELECT ... FOR UPDATE 这样的行级锁不同,咨询锁与具体的数据无关,因此能提供更好的性能。

使用场景

当多个进程访问同一个数据库,且需要协调这些进程对非数据库资源的并发访问时,可以使用咨询锁。

咨询锁的函数及使用

咨询锁可以用一个 64 位数字或两个 32 位数字表示,并提供了一系列函数实现加锁和释放锁。

常用咨询锁函数
函数名返回类型说明
pg_advisory_lock(key bigint)void获取独占会话级咨询锁
pg_advisory_lock(key int, key2 int)void获取独占会话级咨询锁
pg_advisory_lock_shared(key bigint)void获取共享会话级咨询锁
pg_advisory_lock_shared(key int, key2 int)void获取共享会话级咨询锁
pg_advisory_unlock(key bigint)boolean释放独占会话级咨询锁
pg_advisory_unlock(key int, key2 int)boolean释放独占会话级咨询锁
pg_advisory_unlock_all()void释放当前会话持有的所有会话级咨询锁
pg_advisory_unlock_shared(key bigint)boolean释放共享会话级咨询锁
pg_advisory_unlock_shared(key int, key2 int)boolean释放共享会话级咨询锁
pg_advisory_xact_lock(key bigint)void获取独占事务级咨询锁
pg_advisory_xact_lock(key int, key2 int)void获取独占事务级咨询锁
pg_advisory_xact_lock_shared(key bigint)void获取共享事务级咨询锁
pg_advisory_xact_lock_shared(key int, key2 int)void获取共享事务级咨询锁
pg_try_advisory_lock(key bigint)boolean尝试获取独占会话级咨询锁(立即返回)
pg_try_advisory_lock(key int, key2 int)boolean尝试获取独占会话级咨询锁(立即返回)
pg_try_advisory_lock_shared(key bigint)boolean尝试获取共享会话级咨询锁(立即返回)
pg_try_advisory_lock_shared(key int, key2 int)boolean尝试获取共享会话级咨询锁(立即返回)
pg_try_advisory_xact_lock(key bigint)boolean尝试获取独占事务级咨询锁(立即返回)

说明

  • 名称中有 lock 的是加锁函数,有 unlock 的是释放锁函数。
  • 名称中有 xact 的是事务级别的咨询锁,否则为会话级别。
  • 名称中有 try 的函数会尝试加锁并立即返回结果,不会阻塞。

事务级与会话级咨询锁的关系

事务级与会话级咨询锁实际上指向同一把锁。例如,当一个事务锁住某个键时,另一个会话试图获取同一键的会话级锁也会被阻塞。

示例

Session 1:

SELECT pg_advisory_lock(1);  -- 获取会话级锁

Session 2:

BEGIN;
SELECT pg_advisory_xact_lock(1);  -- 被阻塞,直到 Session 1 释放锁

并发控制案例

Session 1:

CREATE TABLE test (id INT PRIMARY KEY);
INSERT INTO test VALUES (1), (2);

BEGIN;
DELETE FROM test WHERE id = 1;
INSERT INTO test VALUES (1);
COMMIT;

Session 2(在 Session 1 未提交时执行):

BEGIN;
DELETE FROM test WHERE id = 1;  -- 可能因锁冲突报错
INSERT INTO test VALUES (1);
COMMIT;

解决方案:使用 pg_try_advisory_xact_lock

SELECT pg_try_advisory_xact_lock(1);  -- 尝试获取锁
DELETE FROM test WHERE id = 1;
INSERT INTO test VALUES (1);
END;

常见问题

  1. 连接中断后,咨询锁是否释放?
    。连接中断后会话结束,所有持有的咨询锁会被释放。

  2. 事务回滚或提交后,会话级咨询锁是否释放?
    不会。会话级咨询锁与事务无关。

  3. 一个会话持有事务级锁时,另一个会话能否同时持有同一键的会话级锁?
    不能。两者代表同一把锁,会互相阻塞。


SQL/MED(管理外部数据)

介绍

SQL/MED 是 SQL 语言中管理外部数据的一个扩展标准,通过它可以将多种异构数据库或其他 PostgreSQL 数据库连接起来,实现跨数据源查询。

框架示意图

应用程序 → PostgreSQL → SQL/MED → 外部数据源(如 MySQL、Oracle、文件等)

image-20260119222301930image-20260119222338525

创建步骤

1. 创建外部数据包装器(FDW)

FDW 定义了如何从外部数据源获取数据。

CREATE EXTENSION postgres_fdw;    -- 用于连接 PostgreSQL
CREATE EXTENSION file_fdw;        -- 用于连接文件
CREATE EXTENSION oracle_fdw;      -- 用于连接 Oracle
CREATE EXTENSION mysql_fdw;       -- 用于连接 MySQL
2. 创建外部服务器对象

定义如何连接外部数据源。

-- 连接另一台 PostgreSQL
CREATE SERVER postgres_fdw_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.10.90', dbname 'center', port '5432');

-- 连接 MySQL
CREATE SERVER mysql_fdw_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (address '10.0.3.236', port '3306');

权限分配

GRANT USAGE ON FOREIGN SERVER mysql_fdw_server TO user02;
3. 创建用户映射

定义本地用户与远程用户的映射关系。

CREATE USER MAPPING FOR user01
SERVER postgres_fdw_server
OPTIONS (user 'user02', password 'okuser02');
4. 创建外部表

将外部数据映射为本地表。

CREATE FOREIGN TABLE fttest01 (
    id INT,
    note TEXT
) SERVER postgres_fdw_server
OPTIONS (table_name 'testtab01');

file_fdw 使用实例

/etc/passwd 文件映射为外部表。

CREATE EXTENSION file_fdw;

CREATE SERVER file_fdw_server FOREIGN DATA WRAPPER file_fdw;

CREATE FOREIGN TABLE passwd (
    username TEXT,
    pass TEXT,
    uid INT4,
    gid INT4,
    gecos TEXT,
    home TEXT,
    shell TEXT
) SERVER file_fdw_server
OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null '');

-- 查询示例
SELECT * FROM passwd LIMIT 5;
SELECT * FROM passwd ORDER BY uid ASC LIMIT 10;

日志文件映射(需在 postgresql.conf 中设置):

log_destination = 'csvlog'
logging_collector = on

postgres_fdw 使用实例

连接远程 PostgreSQL 数据库。

远程数据库准备
CREATE TABLE testtab01 (id INT, note TEXT);
INSERT INTO testtab01 
SELECT generate_series(1,10000), 'a' || repeat('a', 200);
本地数据库配置
-- 安装扩展
CREATE EXTENSION postgres_fdw;

-- 创建外部服务器
CREATE SERVER postgres_fdw_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '10.0.3.236', dbname 'user01', port '5432');

-- 用户映射
CREATE USER MAPPING FOR CURRENT_USER
SERVER postgres_fdw_server
OPTIONS (user 'user01', password 'okuser01');

-- 创建外部表
CREATE FOREIGN TABLE fttest01 (
    id INT,
    note TEXT
) SERVER postgres_fdw_server
OPTIONS (table_name 'testtab01');

-- 查询
SELECT * FROM fttest01 LIMIT 2;
EXPLAIN SELECT * FROM fttest01 LIMIT 2;

oracle_fdw 使用实例

连接 Oracle 数据库。

-- 创建扩展
CREATE EXTENSION oracle_fdw;

-- 创建外部服务器
CREATE SERVER oradb
FOREIGN DATA WRAPPER oracle_fdw
OPTIONS (dbserver '//192.168.56.8:1521/orcl');

-- 用户映射
CREATE USER MAPPING FOR postgres
SERVER oradb
OPTIONS (user 'test', password 'cstech');

-- 创建外部表
CREATE FOREIGN TABLE "test_tab" (
    id INT,
    name TEXT
) SERVER oradb
OPTIONS (table 'TEST_TAB');

mysql_fdw 使用实例

连接 MySQL 数据库。

-- 创建扩展
CREATE EXTENSION mysql_fdw;

-- 创建外部服务器
CREATE SERVER mysql_fdw_server
FOREIGN DATA WRAPPER mysql_fdw
OPTIONS (address '10.0.3.236', port '3306');

-- 用户映射
CREATE USER MAPPING FOR CURRENT_USER
SERVER mysql_fdw_server
OPTIONS (username 'mysql_user', password 'mysql_pass');

-- 创建外部表
CREATE FOREIGN TABLE mysql_table (
    id INT,
    content TEXT
) SERVER mysql_fdw_server
OPTIONS (dbname 'testdb', table_name 'source_table');

总结

功能说明
咨询锁应用级别锁,不依赖具体数据,适用于跨进程协调
SQL/MED外部数据访问框架,支持多种异构数据源
FDW 类型PostgreSQL、MySQL、Oracle、文件、ODBC 等
使用流程创建扩展 → 创建服务器 → 用户映射 → 创建外部表

内容概要:本文档是一份针对全国大学生电子设计竞赛(NUEDC)的“保姆级”实战指导手册,系统涵盖赛题解析与方案库、模块化代码与电路实现、以及测试报告范例三大核心部分。手册深入剖析了电赛七大赛题类别及其命题规律,强调“基本要求+发挥部分”的结构点、指标逐年收紧趋势及测量与控制复合型题目的增加。通过数控直流电流源频率性测试仪两个典型案例,展示了从系统方案设计、关键器件选型到软硬件实现的完整路径。同时,提供了基于STM32 HAL库的ADC采样、PWM生成、OLED显示、无线通信等常用模块的详细电路原理与驱动代码,并辅以测试报告范例评分标准解析,帮助参赛者规范撰写高质量设计报告。; 适合人群:参加全国大学生电子设计竞赛的本科生及指导教师,尤其适合有一定单片机电路基础、希望在短时间内高效备赛并提升获奖概率的团队。; 使用场景及目标:①帮助参赛者快速掌握电赛命题规律与主流技术方案,精准应对电源类、控制类、仪器仪表类等高频赛题;②提供可复用的模块化代码与电路设计,加速硬件搭建与软件开发进程;③指导撰写符合评审标准的设计报告,强化误差分析与测试数据呈现,提升综合得分。; 阅读建议:建议按照“赛题分析→方案设计→模块实现→报告撰写”的流程顺序阅读,重点学习典型案例的整体设计思路与关键器件选型依据。对于代码与电路部分,应在实际开发板上动手验证,结合示波器、逻辑分析仪等工具进行调试。撰写报告时,务必参考文中测试表格与误差分析模板,确保数据完整、分析定量,避免因报告不规范而失分。;
内容概要:本文系统介绍了基于投资组合CVaR(条件风险价值)对象的金融投资组合优化方法,重点阐述了利用Matlab代码实现CVaR风险度量下的资产配置优化过程。相较于传统VaR仅衡量定置信水平下的最大损失,CVaR进一步评估超出该阈值的平均尾部损失,具有更好的数学性质如凸性次可加性,更适用于构建可优化的数学模型。文中详细讲解了CVaR优化模型的理论基础、目标函数设计、约束条件设置以及Matlab金融工具箱中PortfolioCVaR类的具体应用步骤,并结合实证案例演示了如何加载资产数据、设定预期收益率与风险偏好、执行优化求解及分析有效前沿,帮助投资者在控制极端下行风险的前提下实现最优资产配置。; 适合人群:具备一定金融工程、数量经济学或风险管理背景,熟悉Matlab编程环境,正在从事量化投资、资产配置建模、金融产品设计等相关工作的研究人员、高校师生及金融机构从业人员。; 使用场景及目标:①用于金融机构构建高阶风险管理导向的投资组合,提升对尾部风险的防控能力;②支持学术研究中对不同风险度量模型(如VaR与CVaR)在组合优化中表现差异的实证比较;③辅助教学实践中开展现代投资组合理论与高级风险控制技术相结合的编程实训课程。; 阅读建议:建议读者结合Matlab平台动手复现文中的代码示例,深入理解CVaR优化模型的构建逻辑与求解流程,并尝试调整资产数据、置信水平约束条件以观察优化结果的变化,从而掌握其在真实投资决策中的灵活应用技巧。
标题基于SpringBoot的学生读书笔记共享平台设计研究AI更换标题第1章引言介绍学生读书笔记共享平台的研究背景、意义、国内外研究现状、论文方法以及创新点。1.1研究背景与意义阐述学生读书笔记共享平台在当前教育环境下的重要性。1.2国内外研究现状分析国内外学生读书笔记共享平台的研究进展与现状。1.3研究方法及创新点概述本文的研究方法与平台设计的创新点。第2章相关理论总结评述与SpringBoot及读书笔记共享平台相关的理论。2.1SpringBoot框架介绍阐述SpringBoot框架的点、优势及其在Web开发中的应用。2.2读书笔记共享平台相关理论介绍读书笔记共享平台的设计原则、功能需求及用户体验理论。2.3数据库设计与优化理论简述数据库设计的基本原则及优化策略。第3章平台设计详细介绍基于SpringBoot的学生读书笔记共享平台的设计方案。3.1平台架构设计平台的整体架构,包括前端、后端及数据库的设计。3.2功能模块设计阐述平台的主要功能模块,如用户管理、笔记上传、笔记分享等。3.3数据库设计介绍数据库的设计方案,包括表结构、索引及关系设计。第4章平台实现详细描述平台的具体实现过程,包括技术选型、开发环境搭建等。4.1技术选型与开发环境介绍开发平台所采用的技术栈及开发环境配置。4.2关键代码实现展示平台实现过程中的关键代码片段,如用户登录、笔记上传等功能的实现。4.3平台测试与优化平台的测试过程及优化策略,确保平台的稳定性性能。第5章平台应用与分析对平台的应用效果进行分析,包括用户反馈、使用数据等。5.1用户反馈收集与分析收集用户反馈,分析用户对平台的满意度及改进建议。5.2使用数据分析通过数据分析工具,分析平台的使用情况,如用户活跃度、笔记分享量等。5.3对比方法分析对比其他类似平台,分析本平台的优势与不足。第6章结论与展望总结本文的研究成果,并对未来研究方向
上市公司人工智能技术应用水平主要用于衡量企业在人工智能技术研发、应用部署、业务融合以及战略布局方面的程度 学术界主要采用以下方法测度上市公司人工智能技术应用水平: 第一,人工智能专利测度法:基于企业技术创新产出视角,通过识别上市公司专利申请或授权信息中的人工智能相关专利,利用企业年度人工智能专利数量衡量其人工智能技术研发能力与技术积累水平 第二,年报文本分析法:基于企业信息披露视角,通过构建人工智能关键词词典,提取上市公司年度报告、管理层讨论与分析(MD&A)等文本中人工智能相关词汇出现频次,并对词频进行对数化处理,以衡量企业人工智能技术关注程度应用水平 第三,机器人渗透度测度法:主要从智能化生产应用角度出发,利用行业层面的工业机器人安装密度,并结合企业所在行业征、就业结构等信息,推算企业层面的自动化人工智能技术渗透程度 第四,综合指数法:从人工智能投资、专利、关键词词频、机器人应用、人工智能项目等多维度构建指标体系,构建综合指数 第五,智能化投资测度法:基于人工智能软件投资额、人工智能硬件投资额之占总资产的比例来衡量企业人工智能基础设施建设技术应用水平 参考李果白云朴(2024)、闫文影陈雨生(2026)的研究思路,本文从企业人工智能技术实际投入角度衡量上市公司人工智能应用水平。具体而言,基于上市公司年度报告财务附注信息,通过关键词识别方法提取人工智能相关软件投资硬件投资,并将二者加总形成企业人工智能投资规模,进一步以人工智能投资额占企业总资产的比例衡量企业人工智能技术应用水平 一、数据介绍 数据名称:上市公司人工智能技术应用水平 数据范围:上市公司企业 时间范围:2007-2025年 样本数量:78325条 数据来源:上市公司年报 二、数据指标 年份 股票代码 股票简称 行业名称 行业代码 省份
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.徐大人ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值