我正在运行 Postgres 8.3,但在运行 ALTER TABLE ADD COLUMN 语句时遇到问题,当我运行此查询时,该语句似乎被 AccessShareLock 阻止
SELECT t.relname,l.locktype,page,virtualtransaction,pid,mode,granted FROM pg_locks l, pg_stat_all_tables t WHERE l.relation=t.relid ORDER BY relation asc;
该表的名称是经销商。
relname | locktype | page | virtualtransaction | pid | mode | granted
dealer | relation | | 2/40 | 12719 | AccessExclusiveLock | f
dealer | relation | | -1/154985751 | | AccessShareLock | t
我也跑了
SELECT * FROM pg_prepared_xacts
那回来了
transaction | gid | prepared | owner | database
154985751 | 131075_MS1hMzIwM2E3OmIwMjM6NTQxMGY0MzE6MWM1ZTg5OQ==_YTMyMDNhNzpiMDIzOjU0MTBmNDMxOjFjNWU4OWM= | 2014-09-19 08:01:49.650957+10 | user | database
事务 id 154985751 看起来类似于 pg_locks 表中的虚拟事务 -1/154985751
我运行了这个命令来查看任何可能在数据库上运行查询的进程
ps axu | grep postgres | grep -v idle
并确认没有其他进程在数据库上运行查询。
运行查询后,日志文件会显示此内容
2014-11-14 17:25:00.794 EST (pid: 12719) LOG: statement: BEGIN;
2014-11-14 17:25:00.794 EST (pid: 12719) LOG: statement: ALTER TABLE dealer ADD bullet1 varchar;
2014-11-14 17:25:01.795 EST (pid: 12719) LOG: process 12719 still waiting for AccessExclusiveLock on relation 2321398 of database 2321293 after 1000.133 ms
2014-11-14 17:25:01.795 EST (pid: 12719) STATEMENT: ALTER TABLE dealer ADD bullet1 varchar;
什么可能导致经销商桌上出现 AccessShareLock?我猜它与事务 154985751 有关有没有办法使用虚拟 ID 来终止事务?