Hibernate Duplicate Entry异常在MySQL中创建Lock on row

时间:2015-03-30 20:14:34

标签: java mysql hibernate database-deadlocks

使用MySQL和Hibernate 4.3.5

我在Mortgage表格中有一行主键091210。在使用hibernate的Java应用程序中,当我(错误地)尝试使用相同的密钥保存抵押时,会记录正确的com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'异常,不会抛出

问题:

抛出/记录此异常但程序未完成执行或终止。此外,我注意到在原始行上创建了更新/删除锁定,导致重复的异常。恢复的唯一方法是,如果我可以手动终止程序,然后orignial行不再“锁定”

  • 这是预期的,有没有人经历过这个?
  • 如何从Java程序中恢复?

我希望这种异常会取消/中断事务,然后抛出异常。但相反,似乎只记录了异常,在DB上创建了一个锁,并且该过程似乎只挂在transaction.commit() ...

代码:

System.out.println("Begin transaction");
session.beginTransaction();

System.out.println("Save mortgage");
session.save(mortgage);
System.out.println("Commit transaction");
session.getTransaction().commit();

System.out.println("Close session");
session.close();
System.out.println("Close SessionFactory");
HibernateUtil.getSessionFactory().close();

相关输出我看到了:

Begin transaction
Save mortgage
Commit transaction
Hibernate: insert into mortgage (address, last_name, inst_id, date, mortgage_num) values (?, ?, ?, ?, ?)
Mar 30, 2015 7:59:54 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

... Caused by: com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'

然后程序挂起,仍然以红灯发光运行,并锁定数据库。

没有try-catch,没有记录。这是来自Eclipse控制台。

1 个答案:

答案 0 :(得分:0)

让我把答案放在这里,这样我就可以正确格式化代码......

在您的代码中,添加一些错误处理:

try {
    System.out.println("Begin transaction");
    session.beginTransaction();

    System.out.println("Save mortgage");
    session.save(mortgage);
    System.out.println("Commit transaction");
    session.getTransaction().commit();

    System.out.println("Close session");
    session.close();
    System.out.println("Close SessionFactory");
    HibernateUtil.getSessionFactory().close();
} catch (HibernateException he) {
    he.printStackTrace();
}

这会将整个堆栈跟踪打印到您的控制台。有更好的方法来记录这样的东西,但不是这样做会很好。当您最终陷入捕获时,您可能还希望对事务进行良好的回滚。但是,在我们解决了更紧迫的问题之后,可以进行这种清理。

如果你愿意,我会在接下来的几天里提出一个很好的教程。