一:DAO 使用事务

当一个应用要执行几条查询,每条查询要从数据库中读取并/或向数据库中写入信息时, 保证数据库没有留下几条查询而只执行了另外几条查询是非常重要的。 事务,在 Yii 中表现为 CDbTransaction 实例,可能会在下面的情况中启动:

 

  • 开始事务.
  • 一个个执行查询。任何对数据库的更新对外界不可见。
  • 提交事务。如果事务成功,更新变为可见。
  • 如果查询中的一个失败,整个事务回滚。

 

上述工作流可以通过如下代码实现:

 

$transaction=$connection->beginTransaction();   //开始事务

try {

foreach($sqls as $sql){

if( !$connection->createCommand($sql)->execute() ){

throw new Exception();

}

}

//.... other SQL executions

$transaction->commit();//提交事务

} catch(Exception $e) // 如果有一条查询失败,则会抛出异常 {

$transaction->rollBack();//事务回滚

//  $apply_arr['errorCode'] = '106';  //数据添加/更新失败
//  $apply_arr['data']['reason'] = $e->getMessage();
//  或 echo  $e->getMessage();

}

 

二. 使用 AR 处理事务

每个 AR 实例都含有一个属性名叫 dbConnection ,是一个 CDbConnection 的实例,这样我们可以在需要时配合 AR 使用由 Yii DAO 提供的 事务 功能:

 

$transaction=Yii::app()->db->beginTransaction();
try{
    foreach ($models as $model) {
        if (!$model->save()) {
            throw new Exception();
        }
    }
    $transaction->commit();
} catch(Exception $e){
    $transaction->rollBack();
}

 

注意:

1:上面开始事务中:红色部分其实都是CDbconnection的实例,

即可以用这种写法:$transaction = Yii::app()->db->beginTransaction();