postgresql ERROR: current transaction is aborted, commands ignored until end of transaction block

转自http://blog.csdn.net/hantiannan/archive/2009/09/24/4590259.aspx

在平时的数据库操作编程中我们会时不时会遇到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");

}

数据库操作B。 //此次数据操作有可能出现上面的错误

事务提交commit。

} catch (Exception ex) {

事务回滚rollback。

} finally {

关闭连接。

}

不当写法2:

连接OPEN。

try {

数据库操作A。

数据库操作B。

事务提交commit。

} catch (Exception ex) {

数据库操作C。 //此次数据操作有可能出现上面的错误

事务提交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 {

关闭连接。

}

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...