Spring Boot Speichern in Threads

OnDemand

Top Contributor
Guten Morgen zusammen,

ich schreibe in verschiedenen Threads Daten in die Datenbank, dabei kann es vor kommen dass 2 Threads in eine Tabelle schreiben und die selben Daten haben. Also zb in eine Tabelle "Hersteller" und beide Threads schreiben grad einen Hersteller "Beton und Zement AG" kommt immer wieder vor, dass es doppelte Einträge gibt. Welche Möglichkeiten gibt es um das zu vermeiden? Ich frage schon vorher ab ob ein Wert drin ist, aber just in dem Moment schreibt wohl der andere Thread den Wert rein.
 
Du kannst bei DML-Operationen die Tabelle sperren ... LOCK TABLE table IN EXCLUSIVE MODE. So kann nur ein INSERT zur selben Zeit auf die Tabelle ausgeführt werden. Wenn du statt des INSERT einen MERGE verwendest, erhältst du auch keine Unique-Constraint-Fehler.
 
Ja, du kannst das in einem Repo kapseln.
Java:
@Repository
public class PersonInsertRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void insertWithQuery(Person person) {
        entityManager.createNativeQuery("MERGE ...")
              .setParameter(1, ...)
              .setParameter(2, ...)
            .setParameter(3, ...)
          .executeUpdate();
    }
}
 
Das ist jetzt dann aber auch ein bisschen ein Coinflip, was am ende in der DB steht, wenn 2x Merge gemacht wird. (Ausser natürlich es sind 2x die selben Daten)
 

Zurück
Oben