Когда вы используете PESSIMISTIC_WRITE JPA, обычно передавайте его в SELECT FOR UPDATE, это делает блокировку в базе данных, не обязательно для строки, которая зависит от базы данных и как вы настраиваете блокировку, по умолчанию блокировка осуществляется по страницам или блок не для строки, поэтому проверьте документацию в базе данных, чтобы подтвердить, как ваша база данных делает блокировку, также вы можете ее изменить, чтобы вы могли применить блокировку для строки. Когда вы вызываете метод deleteAccounts, он запускает новую транзакцию, и блокировка будет активна до тех пор, пока транзакция не совершит (или откат) в этом случае, когда метод закончен, если другая транзакция хочет получить тот же замок, она не может и я подумайте, что именно поэтому у вас есть мертвый замок, я предлагаю вам попробовать какой-то механизм, возможно, оптимистичный замок или блокировку сущностью.
Вы можете попробовать данный тайм-аут, чтобы приобретаемой замок так:
em.createQuery("select u from User", User.class)
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.setHint("javax.persistence.lock.timeout", 5000)
.getResultList();
я нашел хороший article что объясняет лучше эту ошибку, она вызывает в базе данных:
Oracle automatically detects deadlocks and resolves them by rolling back one of the transactions/statements involved in the deadlock, thus releasing one set of resources/data locked by that transaction. The session that is rolled back will observe Oracle error: ORA-00060: deadlock detected while waiting for resource. Oracle will also produce detailed information in a trace file under database's UDUMP directory.
Most commonly these deadlocks are caused by the applications that involve multi table updates in the same transaction and multiple applications/transactions are acting on the same table at the same time. These multi-table deadlocks can be avoided by locking tables in same order in all applications/transactions, thus preventing a deadlock condition.
Какое сообщение об исключении для тупика? –
Исключение [EclipseLink-4002] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: java.sql.SQLException: ORA-00060: обнаружен тупик при ожидании ресурса Код ошибки: 60 –
Есть ли у вас отношения между пользователями? –