Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Hibernate + ON DUPLICATE KEY-Logik

Hibernate kann eine ConstraintViolationException auslösen wenn Sie versuchen, eine Zeile einzufügen, die gegen eine Einschränkung verstößt (einschließlich einer eindeutigen Einschränkung). Wenn Sie diese Ausnahme nicht erhalten, erhalten Sie möglicherweise eine andere allgemeine Hibernate-Ausnahme - dies hängt von der Version von Hibernate und der Fähigkeit von Hibernate ab, die MySQL-Ausnahme einer Hibernate-Ausnahme in der Version und dem Typ der von Ihnen verwendeten Datenbank zuzuordnen ( Ich habe es nicht auf alles getestet).

Sie erhalten die Ausnahme nur nach dem Aufruf von flush() , daher sollten Sie sicherstellen, dass sich dies auch in Ihrem Try-Catch-Block befindet.

Ich würde vorsichtig sein, Lösungen zu implementieren, bei denen Sie zuerst überprüfen, ob die Zeile vorhanden ist. Wenn mehrere Sitzungen gleichzeitig die Tabelle aktualisieren, kann es zu einer Race-Condition kommen. Zwei Prozesse lesen die Zeile fast gleichzeitig, um zu sehen, ob sie existiert; Beide erkennen, dass es nicht vorhanden ist, und versuchen dann beide, eine neue Zeile zu erstellen. Einer wird scheitern, je nachdem, wer das Rennen gewinnt.

Eine bessere Lösung besteht darin, zuerst die Einfügung zu versuchen und, wenn sie fehlschlägt, davon auszugehen, dass sie bereits vorhanden war. Sobald Sie jedoch eine Ausnahme haben, müssen Sie einen Rollback durchführen, was die Verwendung dieses Ansatzes einschränkt.