2012-04-13 8 views
3

Seam 2.2, Jboss 6.1, Winterschlaf 3.5.6 und MSQL Server 2008Hibernate Lock Tabelle

und haben eine Funktion wie diese.

public void deliverFile() { 
    EntityManager jobbEntityManager = (EntityManager)Component.getInstance("jobbEntityManager"); 

    JobbStatusInterface jobbStatus = new JobbStatus(); 
    jobbStatus.setStatus(PluginStatus.INITIATED); 
    jobbEntityManager.persist(jobbStatus); 


      /** 

       Code here to save a file that takes a minutes 
      **/ 





    jobbStatus.setStatus(PluginStatus.DONE); 
    jobbEntityManager.flush(); 





    } 
    public void checkJobb(){ 
    EntityManager jobbEntityManager = (EntityManager)Component.getInstance("jobbEntityManager"); 

     jobbEntityManager.createQuery("from JobbStatus", JobbStatus.class).getResultList(); 


    } 

Ich habe eine Umfrage auf checkJobb alle 10 Sekunden so, wenn die deliveryFile() Funktion ausgeführt wird.

Die checkJobb-Warteschlangen upp und enden bei der Abfrage. Wenn die deliveryFile() -Funktionen beendet sind, werden alle 6 checkJobbs() gleichzeitig beendet.

Auch wenn ich direkt aus der Datenbank auswähle, ist es gesperrt und beendet die Abfrage, nachdem deliveryFile() fertig ist.

Gibt es sowieso, um dies zu lösen, so kann ich meine checkJobb() tun, während DeliveryFile ausgeführt wird?

Antwort

0

READ_COMMITTED_SNAPSHOT anstelle der normalen READ_COMMITTED-Isolierung.

0

Nicht sicher, was Sie mit dem obigen Code erreichen möchten. Wenn Sie überprüfen möchten, ob ein Job initiiert wird, indem Sie den Jobstatus dazwischen laden, ist dies möglicherweise nicht möglich. Da die Daten noch nicht festgeschrieben sind und Sie eine andere Sitzung in der anderen Funktion verwenden, können Sie die Daten möglicherweise nicht sehen.

Nur der letzte Wert des Status wird an die Datenbank übergeben.

+0

Ich möchte in der Lage sein, in die Datenbank zu wählen, während die Funktion deliverFile() ausgeführt wird, aber es sperrt die Datenbank, so dass ich überhaupt keine Abfragen ausführen kann. Sie werden ausgesetzt, bis deliverFile beendet ist. – Trind