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..