From 730d43c008d9619f6e70603c21ff5ecd8ee90cce Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 30 Aug 2019 23:43:00 +1200 Subject: [PATCH] #1807 - ENH: Add SerializableConflictException --- .../ebean/SerializableConflictException.java | 18 ++++++++++++++++++ .../ebean/config/dbplatform/DataErrorType.java | 7 ++++++- .../config/dbplatform/SqlCodeTranslator.java | 7 +++++-- .../ebean/config/dbplatform/SqlErrorCodes.java | 9 ++++++++- .../config/dbplatform/nuodb/NuoDbPlatform.java | 1 + .../dbplatform/oracle/OraclePlatform.java | 1 + .../dbplatform/postgres/PostgresPlatform.java | 1 + 7 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/ebean/SerializableConflictException.java diff --git a/src/main/java/io/ebean/SerializableConflictException.java b/src/main/java/io/ebean/SerializableConflictException.java new file mode 100644 index 000000000..a1ee9fee4 --- /dev/null +++ b/src/main/java/io/ebean/SerializableConflictException.java @@ -0,0 +1,18 @@ +package io.ebean; + +import javax.persistence.OptimisticLockException; + +/** + * Thrown at SERIALIZABLE isolation level for non-recoverable concurrent conflict. + */ +public class SerializableConflictException extends OptimisticLockException { + + private static final long serialVersionUID = 1L; + + /** + * Create with a message and cause. + */ + public SerializableConflictException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/io/ebean/config/dbplatform/DataErrorType.java b/src/main/java/io/ebean/config/dbplatform/DataErrorType.java index dd42c9e8c..808730f34 100644 --- a/src/main/java/io/ebean/config/dbplatform/DataErrorType.java +++ b/src/main/java/io/ebean/config/dbplatform/DataErrorType.java @@ -18,5 +18,10 @@ public enum DataErrorType { /** * Data integrity error like an invalid foreign key. */ - DataIntegrity + DataIntegrity, + + /** + * Non recoverable concurrency conflict. + */ + SerializableConflict } diff --git a/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java b/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java index 71d56c7a1..90ef29de6 100644 --- a/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java +++ b/src/main/java/io/ebean/config/dbplatform/SqlCodeTranslator.java @@ -3,6 +3,7 @@ package io.ebean.config.dbplatform; import io.ebean.AcquireLockException; import io.ebean.DataIntegrityException; import io.ebean.DuplicateKeyException; +import io.ebean.SerializableConflictException; import javax.persistence.PersistenceException; import java.sql.SQLException; @@ -14,12 +15,12 @@ import java.util.Map; */ public class SqlCodeTranslator implements SqlExceptionTranslator { - private final Map map; + private final Map map; /** * Create given the map of SQLState codes to error types. */ - public SqlCodeTranslator(Map map) { + public SqlCodeTranslator(Map map) { this.map = map; } @@ -46,6 +47,8 @@ public class SqlCodeTranslator implements SqlExceptionTranslator { return new DuplicateKeyException(message, e); case DataIntegrity: return new DataIntegrityException(message, e); + case SerializableConflict: + return new SerializableConflictException(message, e); } } // return a generic exception diff --git a/src/main/java/io/ebean/config/dbplatform/SqlErrorCodes.java b/src/main/java/io/ebean/config/dbplatform/SqlErrorCodes.java index a30020a08..6c06d4d96 100644 --- a/src/main/java/io/ebean/config/dbplatform/SqlErrorCodes.java +++ b/src/main/java/io/ebean/config/dbplatform/SqlErrorCodes.java @@ -8,7 +8,7 @@ import java.util.Map; */ public class SqlErrorCodes { - private final Map map = new HashMap<>(); + private final Map map = new HashMap<>(); /** * Map the codes to AcquireLockException. @@ -31,6 +31,13 @@ public class SqlErrorCodes { return add(DataErrorType.DuplicateKey, codes); } + /** + * Map the codes to SerializableConflictException. + */ + public SqlErrorCodes addSerializableConflict(String... codes) { + return add(DataErrorType.SerializableConflict, codes); + } + private SqlErrorCodes add(DataErrorType type, String... codes) { for (String code : codes) { map.put(code, type); diff --git a/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java index f58cedb54..fb4a264a8 100644 --- a/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/nuodb/NuoDbPlatform.java @@ -37,6 +37,7 @@ public class NuoDbPlatform extends DatabasePlatform { new SqlErrorCodes() //.addAcquireLock("") .addDuplicateKey("23000") + .addSerializableConflict("40002") .build(); dbTypeMap.put(DbType.INTEGER, new DbPlatformType("integer", false)); diff --git a/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java b/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java index 5ba237428..1112688ce 100644 --- a/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/oracle/OraclePlatform.java @@ -48,6 +48,7 @@ public class OraclePlatform extends DatabasePlatform { //.addAcquireLock("") .addDuplicateKey("1") .addDataIntegrity("2291") + .addSerializableConflict("72000") .build(); this.openQuote = "\""; diff --git a/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java b/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java index f7a4f63d9..b280d1a61 100644 --- a/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java +++ b/src/main/java/io/ebean/config/dbplatform/postgres/PostgresPlatform.java @@ -52,6 +52,7 @@ public class PostgresPlatform extends DatabasePlatform { .addAcquireLock("55P03") .addDuplicateKey("23505") .addDataIntegrity("23000","23502","23503","23514") + .addSerializableConflict("40001") .build(); this.openQuote = "\"";