【问题标题】:current transaction is aborted, commands ignored until end of transaction block for postgresql with hibernate当前事务被中止,命令被忽略,直到带有休眠的 postgresql 的事务块结束
【发布时间】:2017-12-24 01:15:29
【问题描述】:

我正在使用带有 postgresql 方言的休眠,并且我正在运行一个事务错误。这是我的主要应用:

public class AppControl {

public static void main(String[] args) {
    //Configuration
    Configuration configuration = new Configuration();
    configuration.configure("hibernate.cfg.xml");
    Session session = null;
    Transaction transaction = null;

    //Session Factory
    SessionFactory sessionFactory = configuration.buildSessionFactory();

    try {
        //Session
        session = sessionFactory.openSession();
        //Begin transaction
        transaction = session.beginTransaction();
        //DB operations

        Student student = new Student();
        student.setSno(2);
        student.setSname("Venky");
        session.save(student);
        session.flush();
        transaction.commit();
    }catch (RuntimeException e) {
        try {
            session.flush();
            transaction.rollback();
        }catch(Exception ex) {
            System.out.println("Cannot rollback transaction");
        }
    } finally {

        session.close();
        sessionFactory.close();
    }

}
}

我遇到以下错误

Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute statement
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:190)
at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581)
at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:103)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:461)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:347)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)
at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
at com.demo.app.AppControl.main(AppControl.java:32)
Caused by: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187)
    ... 13 more

这是我的学生表:

sno(pk)|sname

感谢任何帮助。谢谢你

【问题讨论】:

  • 看过这个example
  • 我认为这个堆栈跟踪可能还有更多内容?
  • 会不会是没有为学生设置zipcourse_no造成的?
  • 我第一次运行这个程序时,它可以工作,但它从第二次开始给出这个异常。

标签: java postgresql hibernate transactions


【解决方案1】:

之前的查询失败,您可能在某处吞下了异常,因此它不会输出。或者您需要重新检查日志以找到 first 错误。

【讨论】:

    【解决方案2】:

    架构定义了 PK 限制。 student.setSno(2) 是主键,因此不能重复。这就是第一次运行通过的原因。您可以尝试将 2 更改为不同的值,或者您可以从 PostgreSQL 表中删除记录并尝试再次运行代码。

    如果你将System.out.printStackTrace(e)添加到catch块}catch (RuntimeException e) {我想你会看到问题的根源(例如插入具有相同主键的新记录的问题)。

    异常Caused by: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block 说明了它所说的 - 当前正在运行的事务中出现了一些故障,并且在事务中执行的任何命令都将无效。您应该在连接上调用rollback 事务。

    【讨论】:

    • 我确实在每次运行时都更改了主键。我尝试在连接时回滚事务,但这也没有帮助。
    • 如果有更多信息发生了什么,您是否尝试打印出在 catch 块中捕获的 RuntimeException?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2011-01-13
    • 2013-08-04
    • 2012-05-11
    • 2016-12-11
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多