Dudas con el manejo de Transacciones

12 views
Skip to first unread message

Manuel Gil

unread,
Jan 6, 2010, 12:30:47 PM1/6/10
to Kumbia Enterprise Framework
Hola a todos,

se me presenta una inquietud con respecto al manejo se las
transacciones con TransactionManager; estoy creando un paso a paso de
llenado de formularios de usuario de la siguiente forma.

// controller prueba

paso 1

// vista con formulario 1, la cual tiene un boton con un tag::form,
que al presionarlo envia la informacion a egistrarFormReg

public function formRegAction(){


}

// valida y procesa la informacion del formReg para almacenarla en la
BD

public function registrarFormRegAction(){

$reglas = array(

campo 1
hasta
campo n

/// procesa los campos enviados
);

if($this->validateRequired($reglas)==true){

$nombre = $this->getPostParam("nombre", "alpha");
$funcion = $this->getPostParam("funcion", "alpha");

// incio la transacción, según las instrucciones del manual
de KEF pagina 234
try {
$definition = new TransactionDefinition();
$definition->setIsolationLevel
(TransactionDefinition::ISOLATION_DEFAULT); // con esta contante

SOLATION_SERIALIZABLE no me funciona, estoy utilizando MYSQL , para
que funcione utlizo ISOLATION_DEFAULT

$definition->setPropagation(true);
$definition->setReadOnly(false);
$definition->setTimeout(0);

$transaction =TransactionManager::getUserTransaction
($definition);

$this->Modelo = new Modelo();

$this->Modelo->setTransaction($transaction); // establesco
la transacion


$this->Modelo->setNombre($nombre);
$this->Modelo->setFuncion($funcion);

if($this-> Modelo->save()){

Flash::success("Operación exitosa");
$this->routeTo("action: formRegPaso2"); // enruta a la vista del
paso 2

}else{

Flash::error("Se presentó un error ");
$transaction->rollback();
$this->routeTo("action: formReg");
}
}
catch(TransactionFailed $e) {
Flash::error($e->getMessage());
}

}else{

/// mensaje de la BD cuando hay problemas a almacenar
}

}

// paso 2

// vista con formulario 2, la cual tiene un boton con un tag::form,
que al presionarlo envia la informacion a registrarformRegPaso2

public function formRegPaso2Action(){


}

// valida y procesa la informacion del formRegPaso2 para almacenarla
en la BD

public function egistrarformRegPaso2Action(){

$reglas = array(

campo 1
hasta
campo n

/// procesa los campos enviados
);

if($this->validateRequired($reglas)==true){

$campo1 = $this->getPostParam("campo 1");
$campo2 = $this->getPostParam("campo 2");
$campo3 = $this->getPostParam("campo 3");
$campo4 = $this->getPostParam("campo 4");

try{

// A
$definition = new TransactionDefinition();
$definition->setIsolationLevel
(TransactionDefinition::ISOLATION_DEFAULT); // con esta contante

SOLATION_SERIALIZABLE no me funciona, estoy utilizando MYSQL , para
que funcione utlizo ISOLATION_DEFAULT

$definition->setPropagation(true);
$definition->setReadOnly(false);
$definition->setTimeout(0);


$transaction =TransactionManager::getUserTransaction
($definition); // si no creo de nuevo la definicion me coloca error
por que no se ha inicializado esta variable $definition, según el
ejemplo del manual no se define otra vez pero en este caso la defino
de nuevo en "A", POR QUE DE LO CONTRA PHP LANZA UN ERROR POR NO
DEFINIR ESTA VARIABLE..

$this->Modelo2 = new Modelo2();

$this->Modelo2->setTransaction($transaction); // establesco
la transacion

$this->Modelo2->setCampo1($campo1);
$this->Modelo2->setCampo1($campo1);
$this->Modelo2->setCampo1($campo1);
$this->Modelo2->setCampo1($campo1);

if($this->Modelo2->save()){

Flash::success("Operación exitosa");
$this->routeTo("action: formRegPaso2"); // enruta a la vista del
paso 2


}else{

Flash::error("Se presentó un error ");
$transaction->rollback();
$this->routeTo("action: formReg");
}

if($transaction->commit()==true){
Flash::success("Se creó correctamente el cliente");
}

}catch(TransactionFailed $e){
Flash::error($e->getMessage());
}

}else{

/// mensaje de la BD cuando hay problemas a almacenar
}

}

EL PROBLEMA QUE SOLO ME GUARDA EL ULTIMO REGISTRO EN LA BD, DESPUES DE
HORAS Y HORAS DE INTENTAR HACER FUNCIONAR ESTE EJEMPLO, ME DI CUENTA
DE QUE SE ESTA PERDIENDO LA CADENA DE TRANSACIONES PENDIENTES Y CUANDO
PASO AL PASO 2 SE CREA UN NUEVA TRANSACCION Y SE PIERDEN LA CREADA
ANTERIORMENTE.....

SI ALGUIEN LO HA ECHO FUNCIONAR O TIENEN ALGUNAS SUGERENCIAS PARA
HACER FUNCIONAR ESTE CODIGO LES ESTARIA MUY AGRADECIDO..

Antonio Lopez

unread,
Jan 6, 2010, 12:43:39 PM1/6/10
to kef-s...@googlegroups.com
En lo que entiendo esta mal interpretando como funciona las aplicaciones web...

Una transacción solo funciona para agrupar en una unidad de trabajo todas las operaciones de base de datos por cada acción

Al entrar a la acción 2 ya la transacción de la acción 1 se hizo efectiva con un commit o con un rollback.

Para crear una transacción solo es necesario

$transaction = TransactionManager::getUserTransaction();
$this->Modelo = new Modelo();
$this->Modelo->setTransaction($transaction);

Cuando se guarda un solo registro por acción no es necesario usar transacciones.

Lo que debe usar en este caso es un campo estado en cada modelo para llevar el control de la evolución del proceso, en este caso las transacciones se estan usando de forma incorrecta

2010/1/6 Manuel Gil <genius...@gmail.com>

Manuel Gil

unread,
Jan 6, 2010, 1:00:10 PM1/6/10
to kef-s...@googlegroups.com
Hola Antonio Lopez,

de esta forma lo intente tambien lo intente

$transaction = TransactionManager::getUserTransaction();
$this->Modelo = new Modelo();
$this->Modelo->setTransaction($transaction);

El pensar aplicar transacciones en este proceso es para garantizar que si todos los pasos fuero correctos almacene de lo contrario no guarde nada

si miras el ejemplo del manuel de KEF en la pagina 234, es algo similar a lo que estoy haciendo.... solo que a diferencia del mio es que lo dejo en una vista y luego lo paso a que la procese en otro metodo..

Antonio Lopez

unread,
Jan 6, 2010, 4:35:03 PM1/6/10
to kef-s...@googlegroups.com
Lo que trato de decir es que esta usando de forma incorrecta las transacciones, porque cuando pasa de una acción a otra la transacción se cierra, las transacciones no se mantienen entre peticiones, por eso le decia que era mejor usar un campo estado para llevar el control del proceso ya que las transacciones no se usan como plantea en el ejemplo.
Reply all
Reply to author
Forward
0 new messages