当前位置: 首页 > wzjs >正文

ps怎么做网站特效集团网站建

ps怎么做网站特效,集团网站建,网页培训,网站浮动窗口怎么做的PostgreSQL 的 pg_advisory_lock_shared 函数详解 pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨询锁函数,允许多个会话同时获取相同键值的共享锁,但排斥排他锁。 共享咨询锁 vs 排他咨询锁 锁类型共享锁 (pg_advisory_lock_shared)排他锁 (pg…

PostgreSQL 的 pg_advisory_lock_shared 函数详解

pg_advisory_lock_shared 是 PostgreSQL 提供的共享咨询锁函数,允许多个会话同时获取相同键值的共享锁,但排斥排他锁。

共享咨询锁 vs 排他咨询锁

锁类型共享锁 (pg_advisory_lock_shared)排他锁 (pg_advisory_lock)
并发性允许多个会话同时持有同一时间只能由一个会话持有
排斥性排斥排他锁排斥共享锁和排他锁
使用场景读多写少场景独占访问场景

共享咨询锁函数家族

PostgreSQL 提供以下共享咨询锁相关函数:

函数描述锁类型
pg_advisory_lock_shared(key)获取共享会话级咨询锁(阻塞)共享锁
pg_try_advisory_lock_shared(key)尝试获取共享会话级咨询锁(非阻塞)共享锁
pg_advisory_xact_lock_shared(key)获取共享事务级咨询锁(阻塞)共享锁
pg_try_advisory_xact_lock_shared(key)尝试获取共享事务级咨询锁(非阻塞)共享锁
pg_advisory_unlock_shared(key)释放共享会话级咨询锁-

函数详解

1 pg_advisory _lock_shared(key bigint)

功能:获取会话级共享咨询锁(阻塞)

参数

  • key :64位整数锁标识

示例

-- 会话1获取共享锁
SELECT pg_advisory_lock_shared(123456);-- 会话2可以同时获取相同的共享锁
SELECT pg_advisory_lock_shared(123456);-- 但会话3尝试获取排他锁会被阻塞
SELECT pg_advisory_lock(123456); -- 阻塞直到共享锁释放

2 pg_try_advisory_lock_shared(key bigint)

功能:尝试获取共享会话级咨询锁(非阻塞)

返回值:boolean(true表示获取成功)

示例

DO $$
BEGINIF pg_try_advisory_lock_shared(123456) THENRAISE NOTICE 'Shared lock acquired, performing read operations...';-- 执行只读操作PERFORM pg_advisory_unlock_shared(123456);ELSERAISE NOTICE 'Could not acquire shared lock';END IF;
END $$;

3 pg_advisory_xact_lock_shared(key bigint)

功能:获取事务级共享咨询锁(事务结束时自动释放)

示例

BEGIN;
SELECT pg_advisory_xact_lock_shared(123456);
-- 执行只读操作
COMMIT; -- 锁自动释放

锁兼容性矩阵

当前持有锁 \ 请求锁共享锁排他锁
无锁允许允许
共享锁允许阻塞
排他锁阻塞阻塞

实际应用场景

场景1:读写分离控制

-- 读操作使用共享锁
DO $$
BEGINPERFORM pg_advisory_lock_shared(555);-- 多个会话可以同时执行读操作RAISE NOTICE 'Reading data: %', (SELECT count(*) FROM large_table);PERFORM pg_advisory_unlock_shared(555);
EXCEPTION WHEN OTHERS THENPERFORM pg_advisory_unlock_shared(555);RAISE;
END $$;-- 写操作使用排他锁
DO $$
BEGINPERFORM pg_advisory_lock(555); -- 会阻塞直到所有共享锁释放-- 独占执行写操作INSERT INTO large_table VALUES (...);PERFORM pg_advisory_unlock(555);
EXCEPTION WHEN OTHERS THENPERFORM pg_advisory_unlock(555);RAISE;
END $$;

场景2:缓存更新控制

-- 缓存读取(多个客户端可同时读取)
CREATE OR REPLACE FUNCTION get_cached_data(cache_key text) RETURNS json AS $$
DECLAREresult json;
BEGIN-- 获取共享锁(允许并发读取)PERFORM pg_advisory_lock_shared(hashtext(cache_key));SELECT data INTO result FROM cache_table WHERE key = cache_key;PERFORM pg_advisory_unlock_shared(hashtext(cache_key));RETURN result;
END;
$$ LANGUAGE plpgsql;-- 缓存更新(独占访问)
CREATE OR REPLACE FUNCTION update_cache(cache_key text, new_data json) RETURNS void AS $$
BEGIN-- 获取排他锁(阻塞直到所有共享锁释放)PERFORM pg_advisory_lock(hashtext(cache_key));-- 执行更新INSERT INTO cache_table(key, data, updated_at)VALUES (cache_key, new_data, NOW())ON CONFLICT (key) DO UPDATESET data = EXCLUDED.data, updated_at = NOW();PERFORM pg_advisory_unlock(hashtext(cache_key));
END;
$$ LANGUAGE plpgsql;

场景3:配置热加载

-- 配置读取(多个服务实例可同时读取)
CREATE OR REPLACE FUNCTION get_config() RETURNS SETOF config_entry AS $$
BEGIN-- 获取共享锁确保配置加载过程中不被修改PERFORM pg_advisory_lock_shared(1); -- 使用固定键值1表示配置锁RETURN QUERY SELECT * FROM application_config;PERFORM pg_advisory_unlock_shared(1);
END;
$$ LANGUAGE plpgsql;-- 配置更新(管理员调用)
CREATE OR REPLACE FUNCTION reload_config(new_config json) RETURNS void AS $$
BEGIN-- 获取排他锁确保没有服务正在读取配置PERFORM pg_advisory_lock(1);-- 清空并重新加载配置TRUNCATE application_config;INSERT INTO application_configSELECT * FROM json_populate_recordset(NULL::config_entry, new_config);PERFORM pg_advisory_unlock(1);
END;
$$ LANGUAGE plpgsql;

监控共享咨询锁

查看当前共享锁

SELECT pid, locktype, mode, granted 
FROM pg_locks 
WHERE locktype = 'advisory' AND mode LIKE '%Share%';

查看锁等待情况

SELECT blocked.pid AS blocked_pid,blocking.pid AS blocking_pid,blocked.query AS blocked_query,blocking.query AS blocking_query,blocked.mode AS blocked_mode,blocking.mode AS blocking_mode
FROM pg_catalog.pg_locks blocked
JOIN pg_catalog.pg_stat_activity blocking ON blocking.pid = blocked.blocking_pid
WHERE blocked.locktype = 'advisory' AND NOT blocked.granted;

注意事项

  1. 锁释放

    • 必须确保每个 pg_advisory_lock_shared() 调用都有对应的 pg_advisory_unlock_shared()
    • 事务级共享锁会在事务结束时自动释放
  2. 死锁风险

    • 共享锁之间不会死锁
    • 但共享锁与排他锁混合使用时可能产生死锁
    • 建议使用固定的锁获取顺序
  3. 性能考虑

    • 共享锁比排他锁允许更高的并发性
    • 但大量共享锁仍可能影响性能
  4. 锁粒度

    • 使用不同键值控制不同资源的访问
    • 避免使用太少键值导致过度争用
  5. 会话管理

    • 确保异常情况下锁能被释放(使用EXCEPTION块)
    • 长时间持有锁可能导致其他会话长时间等待

pg_advisory_lock_shared 是实现读多写少场景并发控制的强大工具,合理使用可以显著提高系统吞吐量,特别是在需要协调多个读取者与少量写入者的场景中。


文章转载自:

http://VNIUWlMo.zgdnd.cn
http://Zw6feWSB.zgdnd.cn
http://NWp9BtyS.zgdnd.cn
http://EN5t9LC8.zgdnd.cn
http://wyuAzbMq.zgdnd.cn
http://4rjR7h6C.zgdnd.cn
http://eaq9Hc1n.zgdnd.cn
http://4eEe92uO.zgdnd.cn
http://hJWxIMVb.zgdnd.cn
http://6AAQum4l.zgdnd.cn
http://Tmy8z76r.zgdnd.cn
http://xjLVQpY4.zgdnd.cn
http://nhZJu6R9.zgdnd.cn
http://9ylMi6cn.zgdnd.cn
http://6haEmTh1.zgdnd.cn
http://uerRUdiq.zgdnd.cn
http://r5Lba5Bq.zgdnd.cn
http://9WTViU1d.zgdnd.cn
http://CdQmEe6z.zgdnd.cn
http://p61z3yOX.zgdnd.cn
http://GzTLOe3e.zgdnd.cn
http://saKb0zKO.zgdnd.cn
http://sddt3zVL.zgdnd.cn
http://yo9dA1rQ.zgdnd.cn
http://ikzzxK32.zgdnd.cn
http://yviYQbR1.zgdnd.cn
http://4N0V0P8n.zgdnd.cn
http://vZhK7D5H.zgdnd.cn
http://s0iM47ri.zgdnd.cn
http://WKCdcFj1.zgdnd.cn
http://www.dtcms.com/wzjs/780056.html

相关文章:

  • 网站建设沙漠风中国联通业绩
  • 网页设计企业网站设计的功能沈阳免费网站制作
  • 建商城网站需要什么广州互联网项目工作室
  • 海南省建设工程质量安全检测协会网站最新合肥封闭小区名单
  • 企业网站建设相关书籍专业网站建设开发
  • 建站图标素材网页设计公司有哪些在包头的
  • 网站建设优化推广教程网页设计制作模板及代码
  • dedecms wap网站模板怎么建立图片的网站吗
  • wordpress网站前端想代理个网站建设平台
  • 商务网站开发源码建设厅教育培训网站
  • 做网站用哪个服务器宣威市网站建设
  • 点开图片跳到网站怎么做杭州正规制作网站公司吗
  • 网站建设服务费如何做会计分录贵州网站推广公司
  • 时间管理系统 网站开发wordpress+制作widget
  • 资源专业网站优化排名精美网站建设
  • 网站建设管理与维护ppt可以网站可以做免费的文案广告语
  • 最新款淘宝客源码整网站程序模板+后台带自动采集商品功能带文章网站关键字太多
  • 福建建设注册中心网站店铺装修设计效果图免费
  • 网站设计就业压力微信软文范例100字
  • 东营做网站的公司古典 网站模板
  • 网站导航栏制作门户建设开源软件
  • 太原免费静态网页制作网站广西崇左市住房和城乡建设局网站
  • 网站建设 策划公司建设哪个方便
  • python策略网站怎么做电影宣传推广方案
  • 新手做网站怎么上传系统网络推广方案写作七步法
  • 一些房产网站是怎么做的动漫设计培训班收费
  • 专业做算命网站wordpress缓存无法清除缓存
  • 厦门网站制作网站建设收费软件专业
  • 如何做门户网站注册公司流程和费用2020
  • 黑龙江省城乡建设厅网站首页wordpress wp_post