讲师中心 微信公众号
AI工具推荐 视频效率加速

CI3事务嵌套删除多表数据异常回滚处理实操

冬芳君_7463

冬芳君_7463

发布时间:2026-08-15 17:16:18

|

371人浏览过

|

来源于php中文网

原创

CodeIgniter 3 不支持嵌套事务,需依赖 InnoDB 事务 + 手动顺序执行与异常拦截实现多表删除原子性:开启事务后,SQL 错误由 trans_complete() 自动回滚;PHP 异常须手动调用 trans_rollback();删除顺序须符合外键约束;所有操作需共用同一数据库连接。

ci3事务嵌套删除多表数据异常回滚处理实操

CodeIgniter 3(CI3)本身不提供原生的嵌套事务支持,也没有内置的保存点(SAVEPOINT)机制。当需要在多张表之间执行删除操作并保证原子性时,必须依靠 MySQL InnoDB 的事务特性 + 手动控制流程来实现“异常时全部回滚”。关键不是“嵌套”,而是“统一事务上下文下的顺序执行与异常拦截”。

开启事务并确保自动回滚触发

CI3 的数据库类通过 $this->db->trans_start()$this->db->trans_complete() 管理事务。只要中间任意一个查询失败(如主键不存在、外键约束、SQL 语法错误),CI3 会自动标记事务为失败,并在 trans_complete() 时执行 ROLLBACK。

  • 无需手动写 ROLLBACK 语句,CI3 底层已封装
  • 必须使用 InnoDB 引擎,MyISAM 不支持事务
  • 所有操作(DELETE A、DELETE B、DELETE C 关联)必须在同一个数据库连接实例中执行

多表删除顺序与外键约束处理

删除顺序必须符合外键依赖关系,否则会因约束失败直接中断——这不是业务逻辑错误,而是数据库强制拦截。例如:先删子模块(B 表)、再删关联关系(C 表中的记录)、最后删导航主表(A 表)。

  • 若 B 表有外键指向 A 表,就不能先删 A;应先删 B,再删 A
  • C 表是 B 和另一张表(如 device_type)的中间表,需在 B 删除后、或与 B 同步清理
  • 可在模型方法中按依赖顺序组织 SQL,避免“删不掉”的硬性报错

捕获 PHP 层异常并强制回滚

CI3 的事务机制对 SQL 错误敏感,但对 PHP 运行时异常(如空数组、类型错误、自定义校验失败)不自动响应。如果逻辑判断出错(比如查不到子模块列表就抛异常),需主动干预事务状态。

  • try 块中执行业务逻辑,一旦 throw Exception,立即调用 $this->db->trans_rollback()
  • 不要只依赖 trans_complete() —— 它只管 SQL 执行结果,不管 PHP 异常
  • 示例片段:
$this->db->trans_start(); try {   $this->navigation_model->delete_navigation($uuid);   $modules = $this->navigation_model->get_module_list($uuid);   if (empty($modules)) {     throw new Exception('未找到子模块,无法继续删除');   }   $this->navigation_model->delete_module_relations($modules);   $this->navigation_model->delete_modules($modules);   $this->db->trans_complete();   if ($this->db->trans_status() === FALSE) {     throw new Exception('数据库操作失败');   } } catch (Exception $e) {   $this->db->trans_rollback();   log_message('error', '导航删除事务回滚:' . $e->getMessage());   return ['success' => false, 'msg' => $e->getMessage()]; }

避免事务失效的常见坑

CI3 事务容易“看似开启实则无效”,尤其在多模型调用或加载不同数据库组时。

  • 所有模型必须共享同一个数据库连接对象(默认即可,勿在模型里重新 $this->load->database()
  • 不要在事务块内做 redirect、exit 或 die,会导致 trans_complete() 无法执行
  • 事务期间避免调用非事务安全的操作,如文件写入、cURL 请求失败不处理等——它们不影响 DB 回滚,但会让业务状态失衡
  • 调试时可加 echo $this->db->last_query(); 查看每条 SQL 是否真正在事务中执行

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9184

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5561

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2015

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3448

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4114

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4597

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3582

2023.11.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn