From 18c206768a135f82a5d17bd7ff117724abf02326 Mon Sep 17 00:00:00 2001 From: brempusz Date: Thu, 7 Jun 2018 12:56:33 -0400 Subject: [PATCH] GH-2467: JdbcLockReg: retry on TransDataAccessExc * GH-2467: JdbcLockRegistry should retry on DeadlockLoserDataAccessException Fixes #2467 MySQL 5.7.15 introduced setting `innodb_deadlock_detect` (enabled by default). As a result MySQL JDBC driver throws `DeadlockLoserDataAccessException` when deadlock is detected. `JdbcLockRegistry` doesn't handle it causing lock to be lost. * Retry `doLock()` on data access deadlock instead of loosing the lock * Use TransientDataAccessException instead of derived exceptions (cherry picked from commit 4bb1a61) --- .../integration/jdbc/lock/JdbcLockRegistry.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/JdbcLockRegistry.java b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/JdbcLockRegistry.java index cbe0c54f7a..ae6504dc55 100644 --- a/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/JdbcLockRegistry.java +++ b/spring-integration-jdbc/src/main/java/org/springframework/integration/jdbc/lock/JdbcLockRegistry.java @@ -26,14 +26,12 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.springframework.dao.CannotAcquireLockException; -import org.springframework.dao.CannotSerializeTransactionException; import org.springframework.dao.DataAccessResourceFailureException; -import org.springframework.dao.QueryTimeoutException; +import org.springframework.dao.TransientDataAccessException; import org.springframework.integration.support.locks.DefaultLockRegistry; import org.springframework.integration.support.locks.ExpirableLockRegistry; import org.springframework.integration.support.locks.LockRegistry; import org.springframework.integration.util.UUIDConverter; -import org.springframework.transaction.TransactionTimedOutException; import org.springframework.util.Assert; /** @@ -47,6 +45,7 @@ import org.springframework.util.Assert; * @author Artem Bilan * @author Vedran Pavic * @author Kai Zimmermann + * @author Bartosz Rempuszewski * * @since 4.3 */ @@ -113,7 +112,7 @@ public class JdbcLockRegistry implements ExpirableLockRegistry { } break; } - catch (CannotSerializeTransactionException | TransactionTimedOutException | QueryTimeoutException e) { + catch (TransientDataAccessException e) { // try again } catch (InterruptedException e) { @@ -147,7 +146,7 @@ public class JdbcLockRegistry implements ExpirableLockRegistry { } break; } - catch (CannotSerializeTransactionException | TransactionTimedOutException | QueryTimeoutException e) { + catch (TransientDataAccessException e) { // try again } catch (InterruptedException ie) { @@ -191,7 +190,7 @@ public class JdbcLockRegistry implements ExpirableLockRegistry { } return acquired; } - catch (CannotSerializeTransactionException | TransactionTimedOutException | QueryTimeoutException e) { + catch (TransientDataAccessException e) { // try again } catch (Exception e) {