org.hibernate.exception.LockAcquisitionException при попытке сохранить / обновить объект с помощью hibernate - PullRequest
0 голосов
/ 07 сентября 2018

В нашем приложении мы пытаемся сохранить / обновить объект, используя hibernate. Этот код работает нормально, но периодически мы сталкиваемся с

org.hibernate.exception.LockAcquisitionException.

Трассировка стека, как показано ниже.

org.hibernate.util.JDBCExceptionReporter  - Lock wait timeout exceeded; try restarting transaction
[2018-08-30 01:43:08,261] [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36] [] [] [] [] [] ajp-bio-12409-exec-273  org.hibernate.event.def.AbstractFlushingEventListener  - Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:107)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:180)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:657)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)

В нашем копании мы обнаружили, что запрос на обновление объекта застрял в транзакции, ожидающей блокировки. Но есть еще одна активная транзакция с блокировками строк, которая блокирует запрос на обновление. Странно то, что эта транзакция связана с потоком MySQL, который находится в спящем состоянии без выполнения запроса.

Я не могу понять, почему эта транзакция все еще активна.

0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 422169356276272, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 10420556, ACTIVE 7416 sec
63 lock struct(s), heap size 8400, 3 row lock(s), undo log entries 3
MySQL thread id 18011, OS thread handle 140689540835072, query id 16557351 {DBip} {DBName}

Что может быть причиной того, что спящие потоки MySQL имеют активную транзакцию с блокировками строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...