PostgreSQL 中 now() 的陷阱:事务内时间静止问题
PostgreSQL 中now()是常用的时间函数,但当它在事务内部被调用时,行为可能出乎意料。开发者 Marcin 近日在开发 Emmett 库时踩到了这个坑,并在博客中详细记录了问题根因和解决方案。 核心问题在于:now()返回的是事务开始时的时间戳,而非每次调用时的当前时间。这意味着在同一事务内,无论代码运行了多久、经过了多少次重试,now() 的值始终是事务开启时的那个时间点。 这个特性为什么会引发 Bug?Marcin 遇到的具体场景是分布式锁的获取重试逻辑。当持有锁的事务超时释放后,需要用 WHERE lock_expires_at < now() 来找到已过期的锁并尝试重新...
