Skip to content

Commit 108070c

Browse files
committed
Translate CasMismatchException to OptimisticLockingFailureException.
Translate CasMismatchException to OptimisticLockingFailureException instead of DataIntegrityViolationException. CasMismatchException is a ConcurrencyFailureException which is a TransientDataAccessException. Versus DataIntegrityViolation, which is a NonTransientDataAccessException. Closed #1339.
1 parent ef56e3f commit 108070c

8 files changed

+21
-16
lines changed

src/main/asciidoc/entity.adoc

+1-1
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ public class User {
375375

376376
If you load a document through the template or repository, the version field will be automatically populated with the current CAS value.
377377
It is important to note that you shouldn't access the field or even change it on your own.
378-
Once you save the document back, it will either succeed or fail with a `DataIntegrityViolationException`.
378+
Once you save the document back, it will either succeed or fail with a `OptimisticLockingFailureException`.
379379
If you get such an exception, the further approach depends on what you want to achieve application wise.
380380
You should either retry the complete load-update-write cycle or propagate the error to the upper layers for proper handling.
381381

src/main/java/org/springframework/data/couchbase/core/CouchbaseExceptionTranslator.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.dao.DataRetrievalFailureException;
2626
import org.springframework.dao.DuplicateKeyException;
2727
import org.springframework.dao.InvalidDataAccessResourceUsageException;
28+
import org.springframework.dao.OptimisticLockingFailureException;;
2829
import org.springframework.dao.QueryTimeoutException;
2930
import org.springframework.dao.TransientDataAccessResourceException;
3031
import org.springframework.dao.support.PersistenceExceptionTranslator;
@@ -66,8 +67,11 @@ public final DataAccessException translateExceptionIfPossible(final RuntimeExcep
6667
return new DataRetrievalFailureException(ex.getMessage(), ex);
6768
}
6869

69-
if (ex instanceof CasMismatchException || ex instanceof ConcurrentModificationException
70-
|| ex instanceof ReplicaNotConfiguredException || ex instanceof DurabilityLevelNotAvailableException
70+
if (ex instanceof CasMismatchException || ex instanceof ConcurrentModificationException) {
71+
return new OptimisticLockingFailureException(ex.getMessage(), ex);
72+
}
73+
74+
if ( ex instanceof ReplicaNotConfiguredException || ex instanceof DurabilityLevelNotAvailableException
7175
|| ex instanceof DurabilityImpossibleException || ex instanceof DurabilityAmbiguousException) {
7276
return new DataIntegrityViolationException(ex.getMessage(), ex);
7377
}

src/test/java/org/springframework/data/couchbase/core/CouchbaseTemplateKeyValueIntegrationTests.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.junit.jupiter.api.Test;
4040
import org.springframework.dao.DataIntegrityViolationException;
4141
import org.springframework.dao.DuplicateKeyException;
42+
import org.springframework.dao.OptimisticLockingFailureException;
4243
import org.springframework.data.couchbase.core.ExecutableFindByIdOperation.ExecutableFindById;
4344
import org.springframework.data.couchbase.core.ExecutableRemoveByIdOperation.ExecutableRemoveById;
4445
import org.springframework.data.couchbase.core.ExecutableReplaceByIdOperation.ExecutableReplaceById;
@@ -137,7 +138,7 @@ void upsertAndFindById() {
137138

138139
User badUser = new User(user.getId(), user.getFirstname(), user.getLastname());
139140
badUser.setVersion(12345678);
140-
assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser));
141+
assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.replaceById(User.class).one(badUser));
141142

142143
User found = couchbaseTemplate.findById(User.class).one(user.getId());
143144
assertEquals(modified, found);
@@ -347,7 +348,7 @@ void upsertAndRemoveById() {
347348
// careful now - user and modified are the same object. The object has the new cas (@Version version)
348349
Long savedCas = modified.getVersion();
349350
modified.setVersion(123);
350-
assertThrows(DataIntegrityViolationException.class, () -> couchbaseTemplate.removeById()
351+
assertThrows(OptimisticLockingFailureException.class, () -> couchbaseTemplate.removeById()
351352
.withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId()));
352353
modified.setVersion(savedCas);
353354
couchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified))

src/test/java/org/springframework/data/couchbase/core/ReactiveCouchbaseTemplateKeyValueIntegrationTests.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737

3838
import org.junit.jupiter.api.BeforeEach;
3939
import org.junit.jupiter.api.Test;
40-
import org.springframework.dao.DataIntegrityViolationException;
4140
import org.springframework.dao.DuplicateKeyException;
41+
import org.springframework.dao.OptimisticLockingFailureException;
4242
import org.springframework.data.couchbase.core.ReactiveFindByIdOperation.ReactiveFindById;
4343
import org.springframework.data.couchbase.core.ReactiveRemoveByIdOperation.ReactiveRemoveById;
4444
import org.springframework.data.couchbase.core.ReactiveReplaceByIdOperation.ReactiveReplaceById;
@@ -130,7 +130,7 @@ void upsertAndFindById() {
130130

131131
User badUser = new User(user.getId(), user.getFirstname(), user.getLastname());
132132
badUser.setVersion(12345678);
133-
assertThrows(DataIntegrityViolationException.class,
133+
assertThrows(OptimisticLockingFailureException.class,
134134
() -> reactiveCouchbaseTemplate.replaceById(User.class).one(badUser).block());
135135

136136
User found = reactiveCouchbaseTemplate.findById(User.class).one(user.getId()).block();
@@ -285,7 +285,7 @@ void upsertAndRemoveById() {
285285
// careful now - user and modified are the same object. The object has the new cas (@Version version)
286286
Long savedCas = modified.getVersion();
287287
modified.setVersion(123);
288-
assertThrows(DataIntegrityViolationException.class, () -> reactiveCouchbaseTemplate.removeById()
288+
assertThrows(OptimisticLockingFailureException.class, () -> reactiveCouchbaseTemplate.removeById()
289289
.withCas(reactiveCouchbaseTemplate.support().getCas(modified)).one(modified.getId()).block());
290290
modified.setVersion(savedCas);
291291
reactiveCouchbaseTemplate.removeById().withCas(reactiveCouchbaseTemplate.support().getCas(modified))

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryKeyValueIntegrationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
import org.junit.jupiter.api.Test;
3636
import org.springframework.beans.factory.annotation.Autowired;
3737
import org.springframework.context.annotation.Configuration;
38-
import org.springframework.dao.DataIntegrityViolationException;
3938
import org.springframework.dao.DuplicateKeyException;
39+
import org.springframework.dao.OptimisticLockingFailureException;
4040
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
4141
import org.springframework.data.couchbase.core.CouchbaseTemplate;
4242
import org.springframework.data.couchbase.domain.Airline;
@@ -110,7 +110,7 @@ void saveReplaceUpsertInsert() {
110110
user.setVersion(0);
111111
assertThrows(DuplicateKeyException.class, () -> userRepository.save(user));
112112
user.setVersion(saveVersion + 1);
113-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user));
113+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user));
114114
userRepository.delete(user);
115115

116116
// Airline does not have a version

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@
5555
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
5656
import org.springframework.context.annotation.Bean;
5757
import org.springframework.context.annotation.Configuration;
58-
import org.springframework.dao.DataIntegrityViolationException;
5958
import org.springframework.dao.DataRetrievalFailureException;
59+
import org.springframework.dao.OptimisticLockingFailureException;
6060
import org.springframework.data.auditing.DateTimeProvider;
6161
import org.springframework.data.couchbase.CouchbaseClientFactory;
6262
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
@@ -566,7 +566,7 @@ public void testCas() {
566566
userRepository.save(user);
567567
long saveVersion = user.getVersion();
568568
user.setVersion(user.getVersion() - 1);
569-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user));
569+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user));
570570
user.setVersion(saveVersion);
571571
userRepository.save(user);
572572
userRepository.delete(user);

src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryKeyValueIntegrationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.context.annotation.Bean;
3030
import org.springframework.context.annotation.Configuration;
31-
import org.springframework.dao.DataIntegrityViolationException;
3231
import org.springframework.dao.DuplicateKeyException;
32+
import org.springframework.dao.OptimisticLockingFailureException;
3333
import org.springframework.data.auditing.DateTimeProvider;
3434
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
3535
import org.springframework.data.couchbase.domain.Airline;
@@ -72,7 +72,7 @@ void saveReplaceUpsertInsert() {
7272
user.setVersion(0);
7373
assertThrows(DuplicateKeyException.class, () -> userRepository.save(user).block());
7474
user.setVersion(saveVersion + 1);
75-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user).block());
75+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user).block());
7676
userRepository.delete(user);
7777

7878
// Airline does not have a version

src/test/java/org/springframework/data/couchbase/repository/ReactiveCouchbaseRepositoryQueryIntegrationTests.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.junit.jupiter.api.Assertions.assertThrows;
2323
import static org.junit.jupiter.api.Assertions.assertTrue;
2424

25+
import org.springframework.dao.OptimisticLockingFailureException;
2526
import reactor.core.publisher.Flux;
2627
import reactor.core.publisher.Mono;
2728
import reactor.test.StepVerifier;
@@ -40,7 +41,6 @@
4041
import org.junit.jupiter.api.Test;
4142
import org.springframework.beans.factory.annotation.Autowired;
4243
import org.springframework.context.annotation.Configuration;
43-
import org.springframework.dao.DataIntegrityViolationException;
4444
import org.springframework.dao.DataRetrievalFailureException;
4545
import org.springframework.data.couchbase.CouchbaseClientFactory;
4646
import org.springframework.data.couchbase.config.AbstractCouchbaseConfiguration;
@@ -120,7 +120,7 @@ public void testCas() {
120120
userRepository.save(user).block();
121121
long saveVersion = user.getVersion();
122122
user.setVersion(user.getVersion() - 1);
123-
assertThrows(DataIntegrityViolationException.class, () -> userRepository.save(user).block());
123+
assertThrows(OptimisticLockingFailureException.class, () -> userRepository.save(user).block());
124124
user.setVersion(saveVersion);
125125
userRepository.save(user).block();
126126
userRepository.delete(user).block();

0 commit comments

Comments
 (0)