当在一个应用执行一些查询时, 每次读取 或 写入数据库中的信息, 确保数据库不是只执行了一部分查询, 这一点非常重要.
一个事务处理, 在 Yii 的代表是一个CDbTransaction 实例, may be initiated in this case:
开始事务处理.
逐个执行查询. 任何对数据库的更新对于外部都是不可见的.
提交(Commit)事务. 若事务成功执行, 对数据库的更改变得可见.
若其中一个查询失败, 整个事务被回滚(rolle back).
上面的流程可以使用下面的代码来执行:
$transaction = $connection->beginTransaction ( ) ; try { $connection->createCommand( $sql1 ) ->execute ( ) ; $connection->createCommand( $sql2 ) ->execute ( ) ; //.... other SQL executions $transaction ->commit( ) ; } catch ( Exception $e) // an exception is raised if a query fails { $transaction ->rollBack( ) ; }
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(); }
本文来自投稿,不代表本站立场,如若转载,请注明出处:https://www.unfit.cn/archives/72.html