deleteall() 不支持自动回滚,需手动用事务包裹:开启begintransaction(),try中执行,异常时rollback(),成功时commit();它不触发模型事件,也不等同于migrate/down。

Yii2 的 deleteAll() 本身不支持自动回滚,但它可以放在数据库事务中实现手动回滚。
deleteAll() 不触发事务自动管理
该方法直接生成 DELETE SQL 并执行,绕过模型事件和验证,也不开启或参与任何隐式事务。一旦执行成功,数据立即从表中移除,没有内置“撤销”机制。
必须手动用事务包裹才能回滚
若需回滚能力,必须显式启动事务,并在异常时调用 rollback():
- 用
$transaction = Yii::$app->db->beginTransaction();开启事务 - 在 try 块中执行
AllAdjustments::deleteAll(...) - 发生异常时,执行
$transaction->rollback(); - 成功则调用
$transaction->commit();
注意 deleteAll() 和迁移回滚的区别
别把 deleteAll() 和 yii migrate/down 混淆:
-
deleteAll()是运行时数据删除操作,是否可逆取决于你是否用了事务 -
migrate/down是针对结构变更(如建表、加字段)的逆向操作,它不处理业务数据删除,也不能恢复已被deleteAll()清掉的数据 - 生产环境严禁依赖
migrate/down来“找回”误删的数据
更安全的替代思路
如果业务要求强可逆性,建议:
- 用软删除(如加
is_deleted字段),避免物理删除 - 关键批量操作前先备份目标数据(例如用
createCommand()->select(...)->queryAll()导出) - 删除前记录日志,包含条件、时间、操作人,便于事后追溯











