postgre 表被加锁无法解锁问题

来源:互联网 发布:邯郸峰派网络 编辑:程序博客网 时间:2024/04/30 07:48

 

最近遇到一个很郁闷的问题,在运行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就可以回滚这个事务了。

 

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

 

 

原创粉丝点击