Cómo realizar operaciones multiproceso en una transacción global en Weblogic
from: mit();
77 }
78 else{
79 userTx.rollback();
80 }
81 }catch(Excepción e) {
82 e.printStackTrace(); p> 83 }
84 }
85
86 checkCompletion booleano privado (resultado de ArrayList){
87 boolean toReturn = true;
88 for(int loop=0; looplt; result.size(); loop ){
89 if ((! ((String)result.get(loop)). es igual("OK"))){
90 toReturn = false
91 break
92 }
93 }
94 return toReturn;
95 }
96
97 clase SQLThread extiende weblogic.kernel.AuditableThread {
96 p>
96
p>
96
97 clase SQLThread extiende weblogic.kernel.AuditableThread {
96
97
97AuditableThread {
p>
98
99 Transacción privada tx = nulo
100 resultado privado de ArrayList =; null;
101 cadena privada dsName = nula
p>
102 cadena privada url = nula
103 cadena privada sql = nula; /p>
104
105 SQLThread público (Transacción tx, resultado de ArrayList, String ds, String url, String sql){
106 this.tx = tx ; p>
107 this.sql = sql;
111 } p>
112
113 ejecución pública vacía ( ){
114 Conexión conn = null;
115 try{
116 TransactionManagerImpl tm = (TransactionManagerImpl)TransactionManagerImpl.getTransactionManager();
117 tm.internalResume((TransactionI
mpl)tx);
118 DriverTest test = new DriverTest();
119 conn = test.getConnection(url, dsName);
120 test. ejecutarInsertInPSMT(conn, sql);
121 conn.close();
122 tm.internalSuspend()
123 resultado.add("OK" );
124 }catch(Exception e){
125 result.add("NA");
126 e.printStackTrace(); p>
p>
127 } finalmente{
128 intente{
129 if(conn != null)
130 conn.close ();
p>131 }catch(Excepción e){
132 e.printStackTrace();
133 }
134 }
135 }
136 }
137 }
138
139
La siguiente es una prueba del Código anterior y algunas explicaciones de las limitaciones del código:
1: Conexión conn = getConnection("t3://localhost:8011", "TestXADS"); ¿Por qué aparece esta afirmación aparentemente inútil? En la implementación de Weblogic TM, solo la instancia del servidor que posee el XAResource que participa en la transacción global está calificada para actuar como coordinador de la transacción global, mientras que otras instancias del servidor solo pueden actuar como coordinadores secundarios, y el coordinador siempre es el primero en hacerlo. participar en la instancia de XAResource global porque la designación del coordinador depende del servidor al que se envía la primera solicitud RMI después de que se inicia TX. Connection conn = getConnection("t3://localhost:8001", "TestXADS") se utiliza para especificar que el coordinador de esta transacción global es el servidor 8011. Sin esta declaración, después de que se inician el subproceso 1 y el subproceso 2, cuando inician las operaciones XA, cada XAResouce se considerará a sí mismo como el coordinador de este TX (el subproceso 1 especifica 8011, el subproceso 2 especifica 8021), lo que resultará en la siguiente excepción:
javax.transaction.TransactionRolledbackException (excepción de reversión de transacción). TransactionRolledbackException: el servidor actual es el coordinador y no se encontró ninguna transacción.
ReplicaAwareRemoteRef.java:247)
en weblogic.jdbc.common.internal.RmiDataSource_814_WLStub.getConnection(Fuente desconocida)
en weblogic.transaction.internal.DriverTest1.getConnection(DriverTest1.java :39)
en weblogic.transaction.internal.DriverTest1.access$0(DriverTest1.java:34)
en weblogic.transaction.internal.DriverTest1$SQLThread.run(DriverTest1. java: 135)
2: Ciertas transacciones globales en Weblogic, cuando realizamos operaciones XA, necesitamos interactuar con el back-end XA, en el que llamaremos xaStart(xid, flag), xaEnd( xid, bandera), donde la bandera puede ser NOFLAGS, TMSUCESS, TMRESUME, TMSUSPEND, etc. Si estuviéramos en la misma transacción global, llamaríamos a xaStart(xid, flag) y xaEnd(xid, flag).
Si operamos un RECURSO en varios subprocesos de la misma transacción global al mismo tiempo, entonces nuestros diferentes subprocesos pueden enviar el mismo BANDERA al RM del RECURSO, como xaStart (xid, TMSUSPEND), es decir, dos subprocesos lo envían. al mismo tiempo, TMSUSPEND, que activará XA_ERR de la siguiente manera:
java.sql.SQLException: java.sql.SQLException: excepción inesperada al registrar XAConnection java.sql.SQLException: XA Error: XAER_RMERR: transacción. rama para el recurso 'TestXAPool_1' Se produjo un error en el administrador de recursos cuando falló start(): xa.OracleXAResource.checkError(OracleXAResource.checkError)checkError(OracleXAResource.java. 1017)
en oracle.jdbc.xa.client .OracleXAResource.start(OracleXAResource.java: 227)
en weblogic.jdbc.wrapper.VendorXAResource.start(VendorXAResource.java:50)
en weblogic.jdbc.jta.DataSource .start(DataSource.java:629)
en weblogic.
en weblogic.transaction.internal.XAServerResourceInfo.xaStart(XAServerResourceInfo.java:1073)
en weblogic.transaction.internal.XAServerResourceInfo.enlist(XAServerResourceInfo.java:241)
en weblogic.transaction.internal.XAServerResourceInfo.xaStart(XAServerResourceInfo.java:1073)