一次服务升级时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无法获取锁。

🔎

延伸解读

DDL操作中的锁机制

在Postgresql中,DDL操作需要获取ACCESS EXCLUSIVE锁,这是一种强锁,只有在没有活动事务时才能获得。了解这一点对于避免DDL超时至关重要,尤其是在高并发环境中。

事务管理的重要性

文章指出,未正确管理事务会导致DDL超时。使用上下文管理器虽然可以帮助管理session,但在作用域外使用session时仍需谨慎,以避免未关闭的事务影响数据库操作。

锁超时设置的影响

锁超时设置为2分钟,若有事务持续超过此时间,将阻塞DDL执行。开发者应定期检查长时间运行的查询,以确保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()并不会阻止其再次被调用,可能导致持续活动。

🏷️

标签

➡️

继续阅读