最近遇到一个很郁闷的问题,在运行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就可以回滚这个事务了。
再试试这个表,一切恢复正常!