2016-12-05 2 views
2

Ich war mit Hibernate und wollte wissen, wie Hibernate verarbeitet, während mehrere Benutzeranforderung kommt.Hibernate Save-Methode und Parallelität

@Transaktional auf Datenschichtmethode.

User user = new User(); 
    user.setCreatedBy("TestSad"); 
    user.setUsername("TestSadd"); 
    Integer id = (Integer) this.sessionFactory.getCurrentSession().save(user); 
    // put the debug point here 
    int i = 1; 
    if(i ==1){ 
     // intentionally i was throwing exception as i dont want to save 
     throw new NumberFormatException(); 
    } 

Für meinen Tests habe ich ein Browser Chrome geöffnet und drücken Sie die Transaktion i den ID-Wert um eins erhöht haben, was in db vorhanden ist. Ich habe den Debug-Punkt nicht geschlossen. sag id = 10 Danach habe ich einen weiteren Browser Firefox geöffnet und die Transaktion traf ich bekam den ID-Wert um eins erhöht, was ich beim Debuggen mit Chrome Browser bekam. sag id = 11

Nächstes Szenario. Ich habe den Server neu gestartet. Wieder fortgesetzt die oben genannten Schritte Ich bekomme Werte jedes Mal um eins erhöht. sagen ID 12.

So ist es wirklich gut Winterschlaf auf diese Weise arbeiten, um Probleme zu vermeiden. Ich habe Google-Foren durchlaufen, um zu verstehen, wie es funktioniert, aber es nicht richtig bekommen. Handelt es sich bei Hibernate um die interne Behandlung von ACID? Kann mir bitte jemand helfen, es zu verstehen. Nur neugierig zu wissen.

+1

Bitte beachten Sie die folgende Antwort. http://stackoverflow.com/questions/3616321/concurrent-updates-handling-in-hibernate –

+0

oder überprüfen Sie dies [Antwort] (http://stackoverflow.com/questions/22030448/is-sessionfactory-getcurrentessession-thread- sicher/22030598 # 22030598). – AntJavaDev

Antwort

0

Auto-Inkrement-IDs (und Sequenzen) arbeiten auf diese Weise. Die Werte werden nicht zurückgesetzt, wenn die Transaktion später abgebrochen wird. Zumindest standardmäßig.