postgre 表被加锁无法解锁问题

本文介绍了一种在PostgreSQL中解决分布式事务导致的表锁定问题的方法。通过查询锁信息并利用系统视图找到预备事务,最终通过回滚特定的事务ID来解锁受影响的表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近遇到一个很郁闷的问题,在运行npgsql时使用了它的分布式事务(System.Transaction不是DbTransaction),结果发现一旦程序异常后就无法继续对相应的表进行操作了。

调查了一下原来postgre对这个表加了锁,但是无法释放,重启postgre的服务也无济于事,最后还是在浩瀚的文档中发现了一个办法来回滚事务,就OK啦。

具体做法如下:

1.查询锁:
postgre查询锁
SELECT t1.locktype ,t1.granted , t1.mode ,t2.relname,t3.datname,t3.usename,t3.current_query  from pg_locks  t1
left join pg_class t2 on relation = oid
left join pg_stat_activity t3 on t1.pid = t3.procpid
 如果发现返回的结果集中有你无法操作的那个表证明他被加锁了。
 
2.执行:select * from pg_prepared_xacts

这个视图时当前可用的预备事务的系统视图,会列出在postgre上prepare的所有预备的事务(Transaction)。

 

3.回滚:ROLLBACK PREPARED gid

(回滚一个处于准备好状态的事务)

上面那些事务肯定包含程序异常后的无法处理的那个预备事务。把Gid换成2中查询结果中的guid就可以回滚这个事务了。

 

再试试这个表,一切恢复正常!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值