Skip to main content

事务

方法一:

Yii::$app->db->transaction(function(){
//逻辑代码
});


方法二:

$transaction = Yii::$app->db->beginTransaction();
try{
      //逻辑代码
      $transaction->commit();
}catch(\Exception $e){
      $transaction->rollBack();
      throw $e;
}

 事务嵌套

$db = Yii::$app->db;

// 外层事务开始(真正的 BEGIN)
$outerTransaction = $db->beginTransaction();
try {
      // 执行一些SQL操作...
      $db->createCommand()->insert('user', ['name' => 'user1'])->execute();

      // 内层“事务”块开始(创建保存点 SAVEPOINT level1)
      $innerTransaction = $db->beginTransaction();
      try {
          // 执行更多SQL操作...
          $db->createCommand()->insert('article', ['title' => 'article1'])->execute();

          // 模拟内层操作失败
          // throw new Exception(‘Inner error’);

          // 内层“提交”(释放保存点,并非真正的COMMIT)
          $innerTransaction->commit();
      } catch (\Exception $e) {
          // 内层回滚(执行 ROLLBACK TO SAVEPOINT level1)
          //  article 表插入会被回滚,user 表插入仍然存在
          $innerTransaction->rollBack();
          // 可以选择继续抛出异常,让外部事务也回滚
          // throw $e;
      }

      // 如果内层回滚了,代码会继续执行在这里
      // 可以执行其他操作...

      // 外层提交(真正的 COMMIT)
      $outerTransaction->commit();
      echo "All operations committed.";
} catch (\Exception $e) {
      // 外层回滚(真正的 ROLLBACK,回滚所有操作)
      $outerTransaction->rollBack();
      echo "Transaction failed: " . $e->getMessage();
}