一次服务升级时pg表DDL执行超时失败

一次服务升级时pg表DDL执行超时失败

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

在Postgresql升级中,DDL操作因锁超时失败,查询发现有事务超过2分钟阻塞了DDL执行。最终定位到代码中使用了已关闭的session,导致持续活动,无法获取ACCESS EXCLUSIVE锁。

🎯

关键要点

  • 在Postgresql升级中,DDL操作因锁超时失败。
  • DDL执行需要获取ACCESS EXCLUSIVE锁,只有在没有活动事务时才能获得该锁。
  • 锁超时设置为2分钟,查询发现有事务超过2分钟,导致DDL无法获取锁。
  • 通过SQL查询定位到阻塞DDL执行的活动查询。
  • 测试表明,未关闭的事务会导致DDL超时。
  • 发现代码中使用了已关闭的session,导致持续活动。
  • 使用上下文管理器管理session,但在作用域外使用了session,导致未关闭。
  • 即使调用close(),session仍可能被再次使用,导致DDL无法获取锁。

延伸问答

Postgresql中DDL操作失败的原因是什么?

DDL操作因锁超时失败,无法获取ACCESS EXCLUSIVE锁,因有事务阻塞。

如何查询Postgresql中阻塞DDL执行的事务?

可以通过SQL查询当前超过2分钟的活动查询来定位阻塞事务。

什么是ACCESS EXCLUSIVE锁,它的作用是什么?

ACCESS EXCLUSIVE锁是Postgresql中最强的表级锁,只有在没有活动事务时才能获得。

在Postgresql中,如何避免DDL超时?

确保在执行DDL前没有活动事务,及时关闭所有相关的session。

代码中如何管理Postgresql的session?

使用上下文管理器来管理session的创建与关闭,确保在作用域内使用session。

为什么即使调用close(),session仍可能被再次使用?

因为在作用域外使用session时,close()并不会阻止其再次被调用,可能导致持续活动。

➡️

继续阅读