Ensure version update happens in transaction with insert.

Original pull request #687
This commit is contained in:
Mateusz Chrzonstowski
2024-08-23 03:58:25 +02:00
committed by Jens Schauder
parent dd846bd9e0
commit ae7cb66e3f
3 changed files with 22 additions and 2 deletions

View File

@@ -17,6 +17,7 @@ package example.springdata.jdbc.howto.selectiveupdate;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.Map;
@@ -35,6 +36,7 @@ class PartyHatRepositoryImpl implements PartyHatRepository {
this.template = template;
}
@Transactional
@Override
public void addPartyHat(Minion minion) {

View File

@@ -17,7 +17,6 @@ package example.springdata.jdbc.howto.selectiveupdate;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
class SelectiveUpdateApplication {

View File

@@ -58,7 +58,7 @@ class SelectiveUpdateApplicationTests {
Minion bob2 = minions.findById(bob.id).orElseThrow();
assertThat(bob2.toys).containsExactly(bob.toys.toArray(new Toy[] {}));
assertThat(bob2.toys).containsExactlyElementsOf(bob.toys);
assertThat(bob2.name).isEqualTo("Bob");
assertThat(bob2.color).isEqualTo(Color.PURPLE);
}
@@ -81,4 +81,23 @@ class SelectiveUpdateApplicationTests {
assertThatExceptionOfType(OptimisticLockingFailureException.class).isThrownBy(() -> minions.addPartyHat(bob));
}
@Test
void cannotGrantPartyHatWhenOutOfSync() {
Minion bob = new Minion("Bob").addToy(new Toy("Tiger Duck")).addToy(new Toy("Security blanket"));
minions.save(bob);
minions.turnPurple(bob.id);
assertThat(bob.color).isEqualTo(Color.YELLOW);
assertThat(bob.version).isOne();
assertThatExceptionOfType(OptimisticLockingFailureException.class).isThrownBy(() -> minions.addPartyHat(bob));
Minion bob2 = minions.findById(bob.id).orElseThrow();
assertThat(bob2.name).isEqualTo("Bob");
assertThat(bob2.color).isEqualTo(Color.PURPLE);
assertThat(bob2.version).isEqualTo(bob.version + 1);
assertThat(bob2.toys).extracting("name").containsExactlyInAnyOrder("Tiger Duck", "Security blanket");
}
}