Использование MySQL и Hibernate 4.3.5Hibernate Дублировать запись исключение создает блокировку на строку в MySQL
У меня есть строка в таблице Mortgage
с первичным ключом 091210
. В приложении Java, использующем спящий режим, когда я (ошибочно) пытаюсь сохранить ипотеку с тем же ключом, регистрируется правильное исключение com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry '091210' for key 'PRIMARY'
, не выбрано.
Проблема:
Это исключение выбрасывается/авторизовались пока программа не завершится выполнение ни прекращается. Кроме того, я заметил, что в исходной строке создается блокировка обновления/удаления, которая вызвала дублирующее исключение. Единственный способ восстановления - это, если я могу вручную завершить программу, а затем правильная строка больше не «заблокирована»
- Ожидается ли, что кто-либо испытал это раньше?
- Как это можно восстановить из программы Java?
Я надеялся, что такое исключение отменит/разорвет транзакцию, и тогда будет выбрано исключение. Но вместо этого, кажется, исключение только регистрируется, блокировка создается на БД, и процесс, кажется, просто повесить на 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.
Я предполагаю, что вы поймаете исключение, а затем запишите его в файл журнала. Когда вы его поймаете, выполняете ли вы откат транзакции спящего режима? Потому что это должно исправить замок. – Ractoc
Мое приложение не занималось регистрацией и не было «try-catch». Я буду обновлять ответ с кодом, который я выполнил. – mmcrae
Хорошо, я посмотрю еще немного завтра на работу, если найду запасные 15 минут или около того. – Ractoc