Spring Boot Starter: вопрос о повторной транзакции - PullRequest
0 голосов
/ 10 июля 2020

Я использую mybatis-spring-boot-starter (2.0.1), и у меня возникает проблема, когда иногда я получаю тупиковую запись на mysql:

com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:123)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:637)
at com.mysql.cj.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:418)
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370)
at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:47)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)
at jdk.internal.reflect.GeneratedMethodAccessor107.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)

Это временный, и я думаю, что это происходит с нагрузкой, и я также думаю, что это нормально и может быть решено простым повтором.

Однако я не уверен, где / как реализовать повтор. Я знаю, что Spring поддерживает AOP, а также аннотацию @retry, et c. но поскольку sbs упрощает задачу, я объявляю только источник данных в своей конфигурации, а куча интерфейсов @Mapper, а sbs заботится обо всем остальном.

Мне любопытно, есть ли у sbs простой способ добавить / включить повторную попытку при неудачных исключениях взаимоблокировки.

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете попробовать использовать Spring Retry. Spring Retry предоставляет возможность автоматически повторно вызывать неудачную операцию. Обратите внимание, что это полезно, когда ошибки могут иметь временный характер (например, кратковременный сбой в сети). Spring Retry обеспечивает декларативное управление процессом и поведением на основе политик, которое легко расширять и настраивать.

Ознакомьтесь с документами GitHub repo и Spring

...