事务

要执行事务,模型所对应的表必须属于支持事务的数据源和类型。

所有的事务方法必须用模型的数据源对象来执行。要在模型中获得模型的数据源,请用:

  1. $dataSource = $this->getDataSource();

接着你就可以使用数据源来开始、提交或者回滚事务。

  1. $dataSource->begin();
  2.  
  3. // 执行一些任务
  4.  
  5. if (/*一切正常*/) {
  6. $dataSource->commit();
  7. } else {
  8. $dataSource->rollback();
  9. }

嵌套事务

可以使用 Datasource::begin() 方法多次开始事务。只有当 commitrollback 方法的调用次数与 begin 方法的调用次数相等时,事务才会结束:

  1. $dataSource->begin();
  2. // 执行一些任务
  3. $dataSource->begin();
  4. // 再执行几个任务
  5. if (/*最后的任务成功*/) {
  6. $dataSource->commit();
  7. } else {
  8. $dataSource->rollback();
  9. // 在主任务中改变一些东西
  10. }
  11. $dataSource->commit();

如果数据库支持嵌套事务、并且在数据源中开启嵌套事务支持,才会真的执行嵌套事务。如果不支持嵌套事务或者嵌套事务支持被关闭,在事务模式中,这些方法总是会返回 true。

如果你想多次开始事务、但不使用数据库的嵌套事务,可以使用$dataSource->useNestedTransactions = false; 来关闭嵌套事务支持。这会仅使用一个全局事务。

实际的嵌套事务默认为关闭。使用 $dataSource->useNestedTransactions = true; 来开启它。