Red de conocimiento informático - Material del sitio web - Cómo realizar operaciones multiproceso en una transacción global en Weblogic

Cómo realizar operaciones multiproceso en una transacción global en Weblogic

Cómo realizar operaciones multiproceso en la transacción global de 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

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

107 this.sql = sql;

111 }

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>

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)