最新消息: 新版网站上线了!!!

Yii 异常处理、事务回滚

一:DAO 使用事务

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

 

  • 开始事务.

  • 一个个执行查询。任何对数据库的更新对外界不可见。

  • 提交事务。如果事务成功,更新变为可见。

  • 如果查询中的一个失败,整个事务回滚。

 

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

 

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

try { 

     $connection->createCommand($sql1)->execute(); 

     $connection->createCommand($sql2)->execute(); 

     //.... 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 提供的 事务 功能:

 

$model=Post::model();
$transaction=$model->dbConnection->beginTransaction();
try
{
    // 查找和保存是可能由另一个请求干预的两个步骤
    // 这样我们使用一个事务以确保其一致性和完整性
    $post=$model->findByPk(10);
    $post->title="new post title";
    $post->save();
    $transaction->commit();
}
catch(Exception $e)
{
    $transaction->rollBack();
}

 

注意:

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

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

 

 

 

内容参考:

http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.dao#sec-5

http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar#sec-10

http://gxxsite.com/content/view/id/1.html

http://hnlixf.iteye.com/blog/1560116

转载请注明:谷谷点程序 » Yii 异常处理、事务回滚