CodeIgniter数据库事务什么时候要开

小磊君_7734

小磊君_7734

2026-09-06

541人浏览

原创

多表写入必须用事务包裹,涉及两张及以上表的增删改操作需用事务保证数据一致性;ci3中推荐用trans_begin()、trans_commit()/trans_rollback()显式控制,并避免嵌套、长事务及事务中重定向。

codeigniter数据库事务什么时候要开

多表写入必须用事务包裹

只要一次业务涉及两张及以上表的 insert、update 或 delete,就必须用事务。比如用户注册时要同时写 users 表和 user_profiles 表,中间任一失败,另一张表不能留脏数据。

CI3 中最简写法是:$this->db->trans_start() 开头,$this->db->trans_complete() 结尾,中间放所有 DB 操作。框架会自动判断是否出错并回滚——前提是所有操作走的是同一个 $this->db 实例,且数据库引擎是 InnoDB。

  • MyISAM 不支持事务,开了也白开
  • 跨模型调用时,若各自 new 了一个 DB 实例,事务会失效
  • trans_complete() 必须执行到,否则事务状态卡住,可能影响后续请求

有 PHP 异常风险的操作必须手动回滚

CI3 的 trans_complete() 只捕获 SQL 错误(如字段不存在、外键冲突),不捕获 PHP 层异常(如 file_get_contents() 失败、数组越界)。一旦这类异常发生,事务不会自动回滚,已执行的 SQL 会意外提交。

正确做法是显式控制流程:

  • 用 $this->db->trans_begin() 替代 trans_start()
  • 所有 DB 操作后,检查逻辑条件(如 if (!$result))或用 try/catch
  • 成功则 $this->db->trans_commit(),失败则 $this->db->trans_rollback()

典型场景:转账前先校验余额,这个校验是 PHP 逻辑,失败就得主动回滚,不能等 trans_complete()。

读操作不需要事务,但“读-改-写”要小心

单纯 get() 或 get_where() 不需要事务。但如果你先 get() 查出金额,再 PHP 计算新值,最后 update(),这就构成“读-改-写”,并发下可能超扣款。

CodeIgniter 4.7.0
CodeIgniter 4.7.0

CodeIgniter下载页提供 CodeIgniter 4.7.0 官方源码包,并整理框架安装、数据库配置与入门开发说明。

下载

这时要么用 SELECT ... FOR UPDATE(需手写原生查询 + 事务包裹),要么改用原子 SQL,例如:

$this->db->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1 AND balance >= 100");

注意:WHERE balance >= 100 是关键,它把校验移到数据库层,避免 PHP 层竞争。

事务不是万能锁,嵌套和长事务要避开

CI3 不支持嵌套事务,trans_start() 嵌套调用会静默失效。想在子函数里“假装”开启事务,实际只是共用外层上下文。

长事务(比如含文件上传、HTTP 请求)极易拖垮数据库连接池,还可能锁表太久。真正该放事务里的,只限纯粹的数据库语句;外部 I/O、API 调用、耗时计算一律剥离出去,放到事务之外。

最容易被忽略的一点:事务期间不能 redirect() 或提前输出响应,否则 trans_complete() 可能无法执行,导致连接未释放、事务悬停。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

codeigniter

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP CodeIgniter框架
PHP CodeIgniter框架

本专题专注于 PHP 轻量级框架 CodeIgniter 的学习与应用,系统讲解 MVC 模型、路由与控制器、数据库操作、表单验证、安全机制以及 REST API 开发。通过博客系统、内容管理平台和小型电商等实战项目,帮助学员快速掌握 CodeIgniter 的开发方法与实践技能。

2025.08.28

3499

16

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

80

15

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

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

2026.09.23

280

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

180

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程