最近程序在PostgreSQL環境運行時出錯,從日志里查到的最新的錯誤信息是:當前事務被終止,命令被忽略,直到事務塊結束。如果是英文版,則為:
current transaction is aborted, commands ignored until end of transaction block.
但在查找原因時,令人感到十分迷惑,因為SQLException堆棧中給出的錯誤信息與出錯處的代碼看起來風馬牛不相及。這使得在定位出錯位置時走了不少冤枉路。
經過很長時間的努力,才發現原因所在,其特點如下:
- 使用同一個connection執行多個sql;
- 前面執行第一條sql時出錯,但在捕獲SQLException時沒有顯式或隱式的rollback;
- 后面再執行第二條sql時,立即拋出“當前事務被終止,命令被忽略,直到事務塊結束”,例外堆棧里卻仍是第一條sql執行時的錯誤信息。
因此針對第二點,在捕獲SQLException時加上rollback,如:
catch (SQLException e) { conn.rollback(); LOGGER.error(e); }
則之后再執行sql時不會出現此錯誤信息,很快就找到出錯的地方了。
