事务
方法一:
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();
}
No comments to display
No comments to display