postgresql事务出错

在使用postgresql中,有时候会出现ERROR: current transaction is aborted, commands ignored until end of transaction blockp这样的错误。字面上应该就是事务出错的意思了,需要回滚。postgresql是这样的,一旦某个sql查询出错,那么该sql查询之后的查询都会出错。下面转载下如何回滚postgresql事务


本文来自:http://blog.csdn.net/hantiannan/article/details/4590259


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

               关闭连接。

           }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值