transacciones a dos motores de bases de datos diferentes

hola, resulta que necesito trabajar con una base de datos principal en mysql y otra en sql server con algunas tablas. Cuando sucede cierta acción, por ejemplo registrar un empleado, debo insertar los registros en ambas bases de datos. Quiero usar transacciones para asegurarme que los datos sí se insertan correctamente en ambas bd, pero hasta ahora solo tengo el array de conexión a ambas bases de datos y no sé cómo proceder con la segunda. Ayuda por favor. Ya he trabajado con transacciones usando mysql, pero quisiera un rollback en ambas bd en caso de algún problema.

Tendrías que comenzar en ambas bases de datos una transanción, guardar el registro en una de las bd a continuación en caso de éxito guardarlo en la otra y si tiene éxito hacer un commit en ambas.

tengo estos dos arreglos




 		'db'=>array(

 			'connectionString' => 'mysql:host=localhost;dbname=ep',

 			'emulatePrepare' => true,

 			'username' => 'root',

 			'password' => '',

 			'charset' => 'utf8',

 		),

		'dbmssql'=>array(

			'class'=>'CDbConnection',

			'connectionString'=>'mssql:host=BLONDER-LAPTOP\SQLEXPRESS;dbname=sigam',

			'username'=>'sa',

			'password'=>'123456',

			'charset' => 'utf8',

		),



¿cómo hago el insert a ambas bases de datos?, si uso lo siguiente solo me inserta en mysql




$model = new Metas;

$model->nommeta = 'blonder413';

$model->subprograma_id = 1;

$model->usuariocrea = 1;

$model->fechacrea = $this->fecha;		

$model->save();



Creé el siguiente modelo




class Metassigam extends CActiveRecord{

	public static $dbmssql;

	

	public function getDbConnection()

	{

		if(self::$dbmssql !== null) {

			return self::$dbmssql;

		} else {

			self::$dbmssql = Yii::app()->dbmssql;

			

			if (self::$dbmssql instanceof CDbConnection) {

				self::$dbmssql->setActive(true);

				return self::$dbmssql;

			} else {

				throw new CDbException(Yii::t('Active Record requiere una conexión dbmssql'));					

			}

			

		}

	}

	

	public function tableName()

	{

		return 'sigam.metas';

	}

}



Pero me da error el siguiente error:




CDbConnection failed to open the DB connection: could not find driver.

self::$dbmssql = Yii::app()->dbmssql;



Pero si reviso el phpinfo() sí tengo el driver instalado (a menos que falte alguna configuración por hacer)

Tienes dos opciones :

1º Crear una nuevo modelo sobrescribiendo getDbConnection de la siguiente manera :


public function getDbConnection()

{

  return Yii::app()->dbmssql;

}

Y cuando vayas a guardar algo en el otro modelo llamas al callback beforesave y lo guardas en este nuevo modelo.

2º La otra alternativa es parecida, sólamente que en vez de crear un modelo nuevo puedes usar el patron dao para usarlo en el evento beforesave.

Si te falla el driver comprueba que este bien escrito, y en tablename te sobra ‘sigam’ con poner ‘metas’ es suficiente.

Un saludo.

listo, gracia. El problema era el string de conexión, quedó así:




'connectionString'=>'sqlsrv:Server=BLONDER-LAPTOP\SQLEXPRESS;Database=sigam',



Este era el que tenía antes, tal vez no funciona con la versión 2012 de sqlserver o sea por la versión de php




'connectionString'=>'mssql:host=BLONDER-LAPTOP\SQLEXPRESS;dbname=sigam',