# Spring Boot Speichern in Threads



## OnDemand (6. Jun 2021)

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.


----------



## Oneixee5 (6. Jun 2021)

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.


----------



## Oneixee5 (6. Jun 2021)

MySQL kennt noch die INSERT INTO ... ON DUPLICATE KEY UPDATE ... Syntax


----------



## OnDemand (6. Jun 2021)

Ich nutze die .save Methode von Spring/JPA. Da müsste ich wohl über den Entitymanger gehen ?


----------



## Oneixee5 (6. Jun 2021)

Ja, du kannst das in einem Repo kapseln.

```
@Repository
public class PersonInsertRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public void insertWithQuery(Person person) {
        entityManager.createNativeQuery("MERGE ...")
              .setParameter(1, ...)
              .setParameter(2, ...)
            .setParameter(3, ...)
          .executeUpdate();
    }
}
```


----------



## thecain (6. Jun 2021)

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)


----------



## Oneixee5 (6. Jun 2021)

thecain hat gesagt.:


> 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)


Nein, ich habe es so verstanden, dass Inserts mit doppelten Werten vermieden werden sollen.


----------

