【发布时间】:2015-03-30 20:14:34
【问题描述】:
使用 MySQL 和 Hibernate 4.3.5
我在Mortgage 表中有一行,主键为091210。在使用休眠的 Java 应用程序中,当我(错误地)尝试使用相同的密钥保存抵押时,会记录正确的 com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY' 异常,不抛出。
问题:
抛出/记录此异常,但程序未完成执行或终止。此外,我注意到在导致重复异常的原始行上创建了更新/删除锁。恢复的唯一方法是如果我可以手动终止程序,然后原始行不再“锁定”
- 这是预期的,有没有人经历过这种情况?
- 如何在 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 控制台。
【问题讨论】:
-
我假设您捕获了异常,然后将其写入日志文件。当你捕捉到它时,你会回滚休眠事务吗?因为那应该可以修复锁。
-
我的应用没有做任何日志记录,也没有
try-catch。我将使用我执行的代码更新答案。 -
好的,我明天上班再研究一下,如果我能找到 15 分钟左右的空闲时间。
-
帮帮我@Ractoc,你是我唯一的希望;)
标签: java mysql hibernate database-deadlocks