Buenas noticias, creo
hice una prueba
public function actionTest1() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='XXXXXXX';
$model->save();
sleep(30);
$transaction->commit();
throw new CHttpException(404, Yii::t('app', 'Fin test 1'));
}
public function actionTest2() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='YYYYYYYYY';
$model->save();
$transaction->rollBack();
throw new CHttpException(404, Yii::t('app', 'Fin test 2'));
}
ejecute con la misma sesión (en dos pestañas separadas) , test1 y test2
cuando ejecute la accion test1, la pestaña queda "esperando" los 30 segundos del sleep
antes de que termine, ejecute la accion test2 y tambien quedo esperando
hasta que termino test1 y luego se ejecuto
el resultado: solo agrego XXXXXXX
otra prueba
public function actionTest3() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='WWWWWWW';
$model->save();
sleep(30);
$transaction->rollBack();
throw new CHttpException(404, Yii::t('app', 'Fin test 3'));
}
public function actionTest4() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='ZZZZZZ';
$model->save();
$transaction->commit();
throw new CHttpException(404, Yii::t('app', 'Fin test 4'));
}
test3 y luego test4
test4 "espera" la terminación de test3 y luego finaliza
resultado inserta ZZZZZZ
mi conclusión
el metodo beginTransaction no se puede ejecutar en paralelo
pero no da error, sino que "espera" a que el activo termine y se ejecuta
otra prueba: una accion con transacion y otra con autocommit
public function actionTest5() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='AAAAAAAAAAA';
$model->save();
sleep(30);
$transaction->rollBack();
throw new CHttpException(404, Yii::t('app', 'Fin test 5'));
}
public function actionTest6() {
$model= new Patologia();
$model->nombre='BBBBBBBBBBB';
$model->save();
throw new CHttpException(404, Yii::t('app', 'Fin test 6'));
}
inserto BBBBB (luego de esperar la finalizacion de test5)
public function actionTest7() {
$model= new Patologia();
$model->nombre='CCCCCCCCCCCCCCC';
sleep(30);
$model->save();
throw new CHttpException(404, Yii::t('app', 'Fin test 7'));
}
public function actionTest8() {
$model= new Patologia();
$transaction=$model->dbConnection->beginTransaction();
$model->nombre='DDDDDDDDDDDDDDD';
$model->save();
$transaction->rollBack();
throw new CHttpException(404, Yii::t('app', 'Fin test 8'));
}
inserto CCCCCC (la que espero fue test8)
otra conclusión? solo ejecuta de a una acción por vez?
Rta:No
luego probe con dos navegadores distintos y no "espera" ejecuta inmediatamente y los resultados son los mismos
Conclusión final
Si ejecuto en la misma sesión, solo se ejecuta una acción a la vez. por lo tanto. funciona perfecto
Si ejecuto en sesiones distintas, crea conexiones distintas y las transacciones funcionan ok
Espero estar en lo cierto y espero que esto ayude
saludos
Horacio