I want to add one payment and several products in my DB. And i want to protect adding by transaction.
I use InnoDB tables.
$transaction=Yii::app()->db->beginTransaction();
try 
{                          
	$payment=new Payment;
	$payment->amount=10.00;
            
	$payment->save();
                    
	foreach($products as $k=>$v)
	{
		for($i=1;$i<=$v;$i++)
		{
			Yii::log('Start adding of product '.$k.'-'.$i, 'info', 'modules.admin.products');
			$product=new Product;                    
			$product->user_id=1;
			$product->payment_id=$payment->id;
			$product->product_id=$k;
			//
			//Info is required!!!
			//Transaction should be failed!!!
			//
			//$product->info='some text';
							
			Yii::log('Start saving of product '.$k.'-'.$i, 'info', 'modules.manage.usersController');                                    
			if(!$product->save())
			{
				Yii::log('Can\'t save product: '.print_r($product->getErrors(), true), 'error', 'modules.admin.products');    
			}
		}
	}
	$transaction->commit();
	$this->redirect(array('view','id'=>$user->id));
}
catch (Exception $e)
{
	$transaction->rollBack();
	Yii::log('Transaction error: '.print_r($e->getMessage(), true), 'error', 'modules.admin.product');
	$model->addError('payment', 'Database transaction failed.');
} 
info variable of $product model is required. So transaction should be failed.
But what i have in logs
2012/08/18 16:48:34 [trace] [system.db.CDbConnection] Starting transaction
2012/08/18 16:48:34 [trace] [system.db.ar.CActiveRecord] Payment.insert()
2012/08/18 16:48:34 [trace] [system.db.CDbCommand] Executing SQL: INSERT INTO some query here
2012/08/18 16:48:34 [info] [modules.admin.product] Start adding of product 424103-1
2012/08/18 16:48:34 [info] [modules.admin.product] Start saving of product 424103-1
2012/08/18 16:48:34 [error] [modules.admin.product] Can't save userLicense: Array
(
    [info] => Array
        (
            [0] => Info cannot be blank.
        )
)
2012/08/18 16:48:34 [trace] [system.db.CDbTransaction] Committing transaction
So product model wasn’t saved because of error, but transaction was commited! And I have payment record in my DB without any product!!!!
Why?