Skip to content

Commit

Permalink
Ensure version update happens in transaction with insert.
Browse files Browse the repository at this point in the history
Original pull request #687
  • Loading branch information
mat3e authored and schauder committed Aug 23, 2024
1 parent dd846bd commit ae7cb66
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

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;
Expand All @@ -35,6 +36,7 @@ public PartyHatRepositoryImpl(NamedParameterJdbcOperations template) {
this.template = template;
}

@Transactional
@Override
public void addPartyHat(Minion minion) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
class SelectiveUpdateApplication {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ void turnPurpleByDirectUpdate() {

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);
}
Expand All @@ -81,4 +81,23 @@ void grantPartyHat() {
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");
}

}

0 comments on commit ae7cb66

Please sign in to comment.