Ausnahmebehandlung in Sperrszenarien implementieren

Um zu verhindern, dass Sperren übermäßig lange gehalten werden, wenn eine Ausnahme des Typs "LockTimeoutException" oder "LockDeadlockException" eintritt, muss eine Anwendung sicherstellen, dass unerwartete Ausnahmen abgefangen werden und die Rollback-Methode aufgerufen wird, wenn etwas Unerwartetes eintritt.

Vorgehensweise

  1. Ausnahme abfangen und generierte Nachricht anzeigen.
    try  {    
    ...
    } catch (ObjectGridException oe) {
    System.out.println(oe);
    }

    Daraufhin wird die folgende Ausnahme angezeigt:

    com.ibm.websphere.objectgrid.plugins.LockDeadlockException: Nachricht
    Diese Nachricht stellt die Zeichenfolge dar, die als Parameter übergeben wird, wenn die Ausnahme erstellt und ausgelöst wird.
  2. Transaktion nach einer Ausnahme rückgängig machen:
    Session sess = ...;
    ObjectMap person = sess.getMap("PERSON");
    boolean activeTran = false;
    try
    {
        sess.begin();
        activeTran = true;
        Person p = (IPerson)person.get("Lynn");
        // Lynn hat Geburtstag, also machen wir sie ein Jahr älter.
        p.setAge( p.getAge() + 1 );
        person.put( "Lynn", p );
        sess.commit();
        activeTran = false;
    }
    finally
    {
        if ( activeTran ) sess.rollback();
    }
    Der Block finally im Code-Snippet stellt sicher, dass eine Rollback-Operation für eine Transaktion durchgeführt wird, wenn eine unerwartete Ausnahme eintritt. Sie behandelt nicht nur Ausnahmen des Typs "LockDeadlockException", sondern auch alle anderen unerwarteten Ausnahmen, die eintreten können. Der Block "finally" behandelt Ausnahmen, die während des Aufrufs der Methode "commit" eintreten. Dieses Beispiel ist nicht einzige Möglichkeit für die Behandlung unerwarteter Ausnahmen, und es kann Fälle geben, in denen die Anwendung einige der unerwarteten Ausnahmen abfangen und eine ihrer eigenen Ausnahmen anzeigen möchte. Sie können nach Bedarf Catch-Blocks hinzufügen, aber die Anwendung muss sicherstellen, dass das Code-Snippet nicht ohne Abschluss der Transaktion beendet wird.