11.3.2. Optimisation LRCO pour une validation en 1 phase (1 PC)

Bien que le protocole de validation en deux phases (2PC) soit plus commun, certaines situations ne peuvent pas accommoder les deux phases. Dans ces cas, vous pouvez utiliser le protocole single phase commit (1PC). Cela a lieu par exemple quand une source de données non-XA-aware doit participer à la transaction.
Dans ces situations, une optimisation appelée Last Resource Commit Optimization (LRCO) est employée. La ressource monophasée est traitée en dernier dans la phase de préparation de la transaction, et il y a une tentative de validation. Si la validation réussit, le journal des transactions est écrit et les ressources restantes passent par le protocole 2PC. Si la dernière ressource ne parvient pas à être validée, la transaction est annulée.
Malgré que ce protocole permet le traitement de la plupart des opérations, certains types d'erreurs peuvent aboutir à des résultats de transactions inconsistants. Il est donc recommandé d'utiliser cette approche en dernier ressort.
Quand on utilise une source de données locale TX dans une transaction, l'optimisation LRCO est automatiquement appliquée.

11.3.2.1. Commit Markable Resource (CRM)

Résumé

La configuration de l'accès à un gestionnaire de ressources via l'interface CRM de validation de ressources marquables (Commit Markable Resource) garantit que le gestionnaire de ressources 1PC puisse être inscrit dans une transaction 2PC. C'est une implémentation de l'algorithme LRCO, qui rend les ressources non-XA entièrement récupérables.

Jusqu'à maintenant, l'ajout de ressources 1PC à une transaction 2PC était réalisée par la méthode LRCO, mais il y a place à erreur avec LRCO. Suivre la procédure ci-dessous pour ajouter des ressources 1PC à une transaction 2PC via la méthode LRCO :
  1. Préparer 2PC
  2. Valider LRCO
  3. Write tx log
  4. Commit 2PC
Si la procédure échoue entre les étapes 2 et 3, vous ne pourrez pas valider le 2PC. CMR élimine cette restriction et permet à 1PC d'être bien inscrit dans une transaction 2PC.
Restrictions

Une transaction peut ne contenir qu'une ressource CMR.

Conditions préalables

Vous devez avoir un tableau créé pour lequel le SQL suivant fonctionne :

SELECT xid,actionuid FROM _tableName_ WHERE transactionManagerID IN (String[])
DELETE FROM _tableName_ WHERE xid IN (byte[[]])
INSERT INTO _tableName_ (xid, transactionManagerID, actionuid) VALUES (byte[],String,byte[])

Exemple 11.1. Voici quelques exemples de requêtes SQL

Sybase :
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
Oracle :
CREATE TABLE xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
IBM :
CREATE TABLE xids (xid VARCHAR(255), transactionManagerID varchar(64), actionuid VARCHAR(255))
CREATE UNIQUE INDEX index_xid ON xids (xid)
SQL Server :
CREATE TABLE xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))
CREATE UNIQUE INDEX index_xid ON xids (xid)
Postgres :
CREATE TABLE xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)
CREATE UNIQUE INDEX index_xid ON xids (xid)
Activer un gestionnaire de ressources en tant que CMR

Par défaut, la fonctionnalité CMR est désactivée pour les sources de données. Pour l'activer, vous devez créer ou modifier la configuration de source de données et vous assurer que l'attribut connectable est défini sur true. Voici un exemple d'entrée de configuration de la section sources de données d'un fichier de configuration xml serveur :

<datasource enabled="true" jndi-name="java:jboss/datasources/ConnectableDS" pool-name="ConnectableDS" jta="true" use-java-context="true" spy="false" use-ccm="true" connectable="true"/>

Note

Cette fonctionnalité ne s'applique pas aux sources de données XA.
Vous pouvez également activer un gestionnaire de ressources en tant que CMR par le CLI de la façon suivante :
/subsystem=datasources/data-source=ConnectableDS:add(enabled="true", jndi-name="java:jboss/datasources/ConnectableDS", jta="true", use-java-context="true", spy="false", use-ccm="true", connectable="true", connection-url="validConnectionURL", driver-name="h2")
Mettre à jour une ressource existante pour qu'elle puisse utiliser la nouvelle fonctionnalité CMR

Si vous ne devez mettre à jour qu'une seule ressource existante pour utiliser la nouvelle fonctionnalité CMR, il vous suffira de modifier l'attribut connectable :

/subsystem=datasources/data-source=ConnectableDS:write-attribute(name=connectable,value=true)

Identification des sources de données pouvant utiliser la fonctionnalité CMR

Le sous-système de transactions identifie les sources de données qui peuvent utiliser la fonctionnalité CMR par l'intermédiaire d'une entrée dans la section de config du sous-système de transaction comme dans l'exemple ci-dessous :

<subsystem xmlns="urn:jboss:domain:transactions:3.0">
    ...
    <commit-markable-resources>
        <commit-markable-resource jndi-name="java:jboss/datasources/ConnectableDS">
            <xid-location name="xids" batch-size="100" immediate-cleanup="false"/>
        </commit-markable-resource>
        ...
    </commit-markable-resources>
</subsystem>

Note

Vous devez démarrer le serveur à nouveau pour ajouter le CMR.