Ich habe das gleiche Problem konfrontiert; Ich muss den Kreditbetrag aktualisieren, und muss modifizierte Zeit, zusammen mit Kreditdetails von DB bekommen. Es ist im Grunde
SYNCHRON/atomar durchführen (UPDATE dann GET) in MYSQL
ich viele Möglichkeiten ausprobiert haben und fand eine, die mein Problem gelöst.
1) option_1 SELECT FOR UPDATE
Dies ist das Schloss bis Update (SYNC von GET Aufrechterhaltung UPDATE), aber ich brauche, bis die GET nach der Aktualisierung sperren.
2) OPTION_2 Stored Procedure
gespeicherte Prozedur nicht synchron wie redis lua ausführen, also dort müssen wir auch Sync-Code, dass auszuführen.
3) OPTION_3 Transaktion
I JPA EntityManager wie unten verwendet habe, dachte, dass vor niemandem aktualisieren begehen kann, und bevor begehen i das aktualisierte Objekt erhalten wird zusammen mit modifizierten Zeit (von DB). Aber ich habe das neueste Objekt nicht bekommen. Nur commit ich habe das Neueste.
4) OPTION_4 LOCK hat das Problem gelöst, also habe ich vor dem Update das Schloss erworben; dann nach GET habe ich das Schloss freigegeben.
private Object getLock(final EntityManager entityManager, final String Id){
entityManager.getTransaction().begin();
Object obj_acquire = entityManager.createNativeQuery("SELECT GET_LOCK('" + Id + "', 10)").getSingleResult();
entityManager.getTransaction().commit();
return obj_acquire;
}
private Object releaseLock(final EntityManager entityManager, final String Id){
entityManager.getTransaction().begin();
Object obj_release = entityManager.createNativeQuery("SELECT RELEASE_LOCK('" + Id + "')").getSingleResult();
entityManager.getTransaction().commit();
return obj_release;
}
Gilt für 'UPDATE SET ... VON ... WHERE ....'? – Kiquenet