transacciones

Hola, resulta que tengo que actualizar los registros de una tabla llamada ep que posee varias relaciones y necesito que al modificar un campo específico se cambie el estado de otra tabla, ej, si modifico el valor de ep, debo cambiar el estado de la tabla solicitudes a pendientes, la cuestión es que como puedo afectar varias tablas ¿será que necesito varias transacciones?. Tengo pensado algo como esto, pero debido a que nunca he usado transacciones en yii tengo la duda de la implementación.




$ep = Ep::model()->findByPk($id);

$objeto = Objeto::model()->findByPk($ep->objeto_id);

$transaction=$ep->dbConnection->beginTransaction();


if (!$ep->save()){

  $transaction->rollBack();

}


if (!$objeto->save()){

  $transaction->rollBack();

}


$transaction->commit();



¿qué me recomiendan al respecto?

Creo que es un buen post sobre el tema Transacciones.

saludos

gracias, empezaré a trabajarlo de esa forma. Pregunta, en el ejemplo que tengo, si no se guarda el ep, debería pedir de nuevo el objeto, necesito hacer beginTransation con ambos modelos o con uno basta.




$ep = Ep::model()->findByPk($id);

$objeto = Objeto::model()->findByPk($ep->objeto_id);

$transaction=$ep->dbConnection->beginTransaction();


try{

  if (!$objeto->save()){

    $transaction->rollBack();

  }


  $ep->objetoid = Yii::app()->db->getLastInsertID();


  if (!$ep->save()){

    $transaction->rollBack();

    // ¿esto elimina el objeto también?

  }

}catch(){

  $transaction->commit();

}



Debería ser algo así:




$ep = Ep::model()->findByPk($id);

$objeto = Objeto::model()->findByPk($ep->objeto_id);

$transaction=$ep->dbConnection->beginTransaction();


try{

  if (!$objeto->save()){

	throw new Exception( 'Objeto error en save' );

  }


  //$ep->objetoid = Yii::app()->db->getLastInsertID();

  $ep->objetoid = $objeto->id;    //intenta ponerlo así ya que $objeto se ha grabado antes.

	

  if (!$ep->save()){

    throw new Exception( 'Ep error en save' );

  }

  

  $transaction->commit();   //-> si llega aquí es que todo ha ido bien.


}catch(Exception $e){ //en este bloque se accede si se ha producido una exception en el bloque try

	Yii::app()->user->setFlash('error',$e->getMessage());

	$transaction->rollBack();  

}



En el bloque try (lo que se intenta realizar) debe acabar con éxito si no hay errores, commit.

En el bloque catch (o bloques) se resuelve el error, en este caso aquí va el mensaje de que ha sucedido y el rollBack.

si ocupabas actualizar varias tablas a la vez, usando model, solo era que hicieras referencia a cada objeto

$model1 = el principal

$model2 = mandas llamar el objeto del modelo (Tabla2());

$model3 = mandas llamar el objeto del modelo (Tabla3());

y en tu save principal guardabas dentro de cada uno, pero dirias me diria que me faltan los demas datos obligatorios por las rules de cada model, para que las evite les pones $model->save(false) y con esto se brinca ese paso, y ya te actualiza el campo o campos que tu le mandes a cada model, si no quieres usar $model->save,

solo utiliza update y listo, antes llena los atributos correspondientes a cada model y al final $model->update(false); y listo, en caso contrario, la transacción que estas utlilizando :D lml. Saludos