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

PostgreSQL 中 now() 函数事务内行为异常,clock_timestamp() 成解决方案

【导语:开发者 Marcin 在开发 Emmett 库时,发现 PostgreSQL 中 now() 函数在事务内行为异常,导致分布式锁获取重试逻辑失效,最终找到用 clock_timestamp() 替代的解决方案。】


PostgreSQL 中 now() 函数事务内异常表现

PostgreSQL 中 now() 是常用的时间函数,但在事务内部调用时,行为出乎意料。它返回的是事务开始时的时间戳,而非每次调用时的当前时间。这意味着在同一事务内,无论代码运行多久、经过多少次重试,now() 的值始终是事务开启时的时间点。

异常引发的 Bug 场景

Marcin 遇到的具体场景是分布式锁的获取重试逻辑。当持有锁的事务超时释放后,需要用 WHERE lock_expires_at < now() 来找到已过期的锁并尝试重新获取。但由于整个重试流程在同一事务内,now() 永远等于事务开始的时间,WHERE 条件无法正确筛选出过期的锁,重试逻辑失效。

解决方案:用 clock_timestamp() 替代

解决方案是用 clock_timestamp() 替代 now()。与 now() 不同,clock_timestamp() 每次调用都返回真实的当前时间,即使在事务内部也能反映时间的流逝。

两者语义区别及使用场景

now() 适合在同一事务内需要所有记录共享同一时间戳的场景,例如审计日志中需要记录事务开始时间;而 clock_timestamp() 适合需要判断时间是否已经推进的场景,例如检查超时、处理定时任务。

编辑观点:此案例提醒开发者在使用 PostgreSQL 时间函数时,要充分考虑事务语义,避免因函数特性引发难以调试的生产问题。

http://www.jsqmd.com/news/943018/

相关文章:

  • 如何在10分钟内构建专业级Arduino音频应用:终极嵌入式音频库指南
  • IOTA 学习笔记(十):交易与 PTB,可编程交易块怎么理解?
  • 别再让单例坑了你!深入理解Unity中MonoBehaviour单例的销毁时机与内存管理
  • 某汽车品牌自燃事件的危机公关全程
  • 深度解析:CloudBeaver云数据库管理平台架构设计与生产部署实战
  • Honey Select 2终极汉化优化补丁:三步搞定完整游戏体验升级
  • 基于ESP8266与GPS模块的宠物追踪器:物联网全栈开发实践
  • 如何用Unlock-Music免费解锁音乐文件:浏览器端解密完整指南
  • Arduino DS1307 RTC与OLED时钟项目:从I2C通信到时间显示全解析
  • Joy-Con Toolkit:5大核心功能解锁任天堂Switch手柄的隐藏潜力
  • 从Macvlan到Ipvlan:在K8s和Docker里选对虚拟网络模式的避坑指南
  • OData V4.01 完整查询语法速查表
  • 15|测试用例与代码映射:平台怎么知道哪个用例测过哪段代码?
  • ZYNQ-7020软硬协同电磁超声测厚方案:含伪随机编码激励、匹配滤波压缩与微伏级回波时延提取
  • 告别盲操作!手把手教你用AutoSar Dcm配置UDS 0x31例程控制(附RID参数详解)
  • 如何用3步实现Elsevier投稿状态智能追踪:科研工作者的终极效率工具
  • 从一次线上故障复盘说起:我是如何用wrk定位Nginx配置瓶颈,并将QPS提升3倍的
  • 保姆级教程:在Proxmox VE 8上用OSX-PROXMOX脚本装macOS Monterey(附VNC远程避坑指南)
  • 从游戏地形到有限元分析:Delaunay三角剖分在Unity与COMSOL中的高效应用与避坑指南
  • 舆情监测数据的真实性困境
  • 别再只会用AT指令了!手把手教你用Python脚本自动化测试NB-IoT模块(附源码)
  • Cricut Joy 2 彩虹套装降至 119.99 美元,入门级手工机实现个性化礼物定制!
  • PHP文件上传处理完整指南
  • Apache Dolphinscheduler 3.0 日志刷屏别慌!用Arthas在线清理缓存实战(附完整命令)
  • Echarts柱状图标签(label)位置终极优化指南:从内置配置到自定义算法的避坑实践
  • 【官方渠道变更公示】2026年6月南京建发璞云售楼处官方热线发布. - 速递信息
  • Python-sc2实战:教你写一个会运营的神族AI(自动造农民、水晶、兵营)
  • 基于555定时器的冰箱门报警器:从原理到实战的电子DIY指南
  • 从零打造模块化3D打印LED光墙:设计、制作与编程全指南
  • 磁轴键盘推荐!IQUNIX EV63实测 这键盘不入后悔