LCT (Local Transaction Containment)
Mit Local Transaction Containment (LTC) wird das Verhalten des Anwendungsservers in einem nicht angegebenen Transaktionskontext festgelegt.
Die Definition für den nicht angegebenen Transaktionskontext finden Sie in der Spezifikation Enterprise JavaBeans Version 2.0 und höher. Lesen Sie z. B. die Spezifikation für diese Technologie.
Ein LTC ist ein gebundener UOW-Bereich (Unit-of-Work, Arbeitseinheit), in dem der Zugriff auf keine, eine oder mehrere RMLTs (Resource Manager Local Transaction) möglich ist. Das LTC definiert die Grenze, an der alle RMLTs beendet sein müssen. Nicht beendete RMLTs werden gemäß Richtlinie vom Container aufgelöst. Ein LTC ist standardmäßig für eine Bean-Instanz lokal. Er wird nicht von mehreren Beans gemeinsam genutzt, selbst wenn diese Beans von demselben Container verwaltet werden. LTCs werden vom Container gestartet, bevor eine Methode einer Komponente der Unternehmensanwendung, z. B. einer Enterprise-Bean oder einem Servlet, zugeteilt wird, und zwar immer dann, wenn die Zuteilung ohne globalen Transaktionskontext erfolgt. LTCs werden vom Container in Abhängigkeit von der in der Anwendung konfigurierten LTC-Grenze vervollständigt; z. B. am Ende der Methodenzuteilung. Für die LTC-Unterstützung ist kein programmgesteuerte Schnittstelle verfügbar. LTCs werden ausschließlich vom Container verwaltet. Der Anwendungsimplementierer konfiguriert die LTCs in den einzelnen Anwendungskomponenten, Webanwendung oder EJB, indem er Transaktionsattribute im Implementierungsdeskriptor der Anwendung verwendet.
Ein LTC kann als Teil des Implementierungsdeskriptors einer Anwendungskomponente konfiguriert werden, d. h., ein LTC kann für mehrere Anwendungskomponenten gelten, einschließlich Webanwendungskomponenten und Enterprise-Beans, die containergesteuerte Transaktionen verwenden. Auf diese Weise können alle diese Komponenten ihre Verbindungen gemeinsam nutzen, ohne eine globale Transaktion zu verwenden. Die gemeinsame Nutzung eines einzelnen Ressourcenmanagers durch mehrere Anwendungskomponenten hat eine Leistungsverbesserung, eine höhere Skalierbarkeit und eine Verringerung der Zugriffskonflikte für Ressourcen zur Folge.
LTCs können von mehreren Komponenten gemeinsam genutzt werden, einschließlich Webanwendungskomponenten und Enterprise-Beans, die containergesteuerte Transaktionen verwenden. Dies ist beispielsweise hilfreich, wenn eine hohe Anzahl von include()-Aufrufen von Webkomponenten stattfindet, bei denen ein Thread mehrere Verbindungen durch LTCs in verschiedenen Webmodulen blockieren kann. In einer solchen Situation können in der Anwendung unter Last Deadlocks im Code auftreten, wenn Threads auf sich selbst warten, dass sie Verbindungen freigeben. Um dieses Problem ohne Verwendung einer globalen Transaktion zu beheben, geben Sie an, dass Anwendungskomponenten LTCs gemeinsam nutzen können. Setzen Sie dazu das Attribut "Shareable" im Implementierungsdeskriptor jeder Komponente. Sie müssen einen Implementierungsdeskriptor verwenden. Dieses Attribut kann nicht angegeben werden, wenn eine Annotation verwendet wurde.
Wenn Sie das Attribut "Shareable" festlegen, enthält die erweiterte XML-Datei des Implementierungsdeskriptors folgende Codezeile:
<local-transaction boundary="BEAN_METHOD" resolver="CONTAINER_AT_BOUNDARY"
unresolved-action="COMMIT" shareable="true"/>
Wenn Sie alle Vorteile eines gemeinsam genutzten LTC nutzen möchten, müssen Sie sicherstellen, dass die Ressourcenreferenz für jede Komponente standardmäßig gemeinsam nutzbare Verbindungen verwendet.

Anwendungen, die gemeinsam nutzbare LTCs verwenden, können die in einem gemeinsam nutzbaren LTC verwendeten Ressourcenmanagerverbindungen nicht explizit festschreiben oder rückgängig machen. Sie können jedoch Verbindungen verwenden, die über die Funktionalität der automatischen Festschreibung verfügen. Auf diese Weise wird die ordnungsgemäße Kapselung der Verbindungsnutzung durch jede Komponente sichergestellt, und es wird außerdem verhindert, dass jede Komponente Annahmen über das Verhalten der anderen Komponenten, mit denen die Verbindung gemeinsam genutzt wird, treffen muss.
Wenn eine Anwendung Arbeit ohne automatische Festschreibung in einem LTC startet, für den das Attribut "Resolver" auf Application und das Attribut "Shareable" auf True gesetzt ist, wird zur Laufzeit eine Ausnahme ausgelöst. Beispielsweise ist eine Arbeit ohne automatische Festschreibung für eine JDBC-Verbindung die Arbeit, die die Anwendung auszuführen versucht, nachdem die Methode "setAutoCommit(false)" verwendet wurde, um die automatische Festschreibung in der Verbindung zu inaktivieren. Enterprise-Beans, die Bean-gesteuerte Transaktionen verwenden, können nicht assembliert werden, wenn das Attribut "Shareable" in der LTC-Konfiguration festgelegt wurde.
![[AIX Solaris HP-UX Linux Windows]](../images/dist.gif)
![[IBM i]](../images/iseries.gif)
- Die Zuteilung der Anwendungskomponente erfolgt ohne Eingreifen eines Containers, z. B. für die Methode create einer Session-Bean ohne Status oder eines durch ein Servlet initiierten Threads.
- J2EE 1.2-Webkomponenten
- J2EE 1.2-BMT-Enterprise-Beans (BMT = Bean-Managed Transaktioncs, Bean-gesteuerte Transaktionen)
Ein LTC kann nicht neben einer globalen Transaktion existieren. Wenn die Zuteilung einer
Anwendungskomponente ohne eine globale Transaktion erfolgt, richtet der Container immer ein LTC ein.
Einzige Ausnahme: Die Zuteilung der Anwendungskomponente erfolgt ohne Eingreifen eines Containers, z. B.
für die Methode create einer Stateless-Session-Bean.
Ein LTC kann einem ActivitySession-Kontext zugewiesen werden, der länger existiert als die Enterprise-Bean-Methode, in der es gestartet wurde. Nähere Informationen hierzu finden Sie im Artikel zu ActivitySessions und Transaktionskontexten.