在平时的数据库操作编程中我们会时不时会遇到ERROR: current transaction is aborted,commands ignored until end of transaction blockp这样的错误。该怎么解决呢?一般我们都是直接上网查找。如果英文好一点的人的话的从错误信息就能知道大概是那个地方出错了。不过如果经验不是很丰富的话,还是上网查找比较方便。最基本错误信息可以从官方文档中查看(http://www.postgresql.org/docs/8.4/interactive/errcodes-appendix.html )。
出现上面的错误是事务控制不恰当的原因,两种不当写法如下。
不当写法1:
连接OPEN。
try {
try {
数据库操作A。
} catch (Exception e) {
log.error("do something");
}
事务提交commit。
} catch (Exception ex) {
事务回滚rollback。
} finally {
关闭连接。
}
不当写法2:
连接OPEN。
try {
数据库操作A。
数据库操作B。
事务提交commit。
} catch (Exception ex) {
事务提交commit。
} finally {
关闭连接。
}
Postgres数据库中,同一事务中如果某次数据库操作中出错的话,那这个事务以后的数据库都会出错。
因此不当写法1中如果数据库操作A中出错,那个同一个的数据库操作B执行的时候就会报错。不当写法2中如果数据库操作A或者数据库操作B中出错,那个同一个的数据库操作C执行的时候就会报错。
为了避免错误,有人在用重新OPEN方法,这样做的话实际是把前面的操作都抛弃掉了(不是自动提交的场合),并且重新开启增加了系统开销,不建议这样修改。
根据出错的原因我们可以把可能出错之前的处理作为一个事务。然后把出错之后的处理作为一个事务,具体怎样做要看具体的逻辑。这样就可以避免出错了。
这样我们可以把不当写法1的修改为
try {
数据库操作A。
} catch (Exception e) {
事务回滚或者提交;
log.error("do something");
}
数据库操作B。
这样我们可以把不当写法2的修改为
} catch (Exception ex) {
事务回滚或者提交;
数据库操作C。
事务提交commit。
} finally {
关闭连接。
}