💡
原文中文,约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()并不会阻止其再次被调用,可能导致持续活动。
➡️