CI框架百问百答:CodeIgniter的事务用法?--第9问

做为一名码工,没用过事务,那也不是好码工。

CodeIgniter的数据库抽象允许你在支持事务安全的数据库表中使用事务。在MySQL中,你需要用InnoDB或BDB表而不是更常用的MyISAM。大多数其它的数据库平台都原生支持事务。

一起看看CodeIgniter的事务:

CodeIgniter 的事务方法

CodeIgniter 使用的事务方法与流行的数据库类ADODB所使用的处理过程非常相似。我们选择那种方法是因为它极大地简化了运行事务的处理过程。大多数情况下你只需要编写两行代码就行了。

传统上, 事务需要实现大量工作, 他们要求你随时跟踪你的查询, 并根据查询的成功或失败来决定  提交  还是  回滚 。这是特别麻烦的嵌套查询。相比之下, 我们实现了一种智能的事务系统, 它将自动地为你做这些事情(如果你选择手动管理你的事务, 这也是可以的, 但这确实没什么好处)。

运行事务

要使用事务来运行你的查询, 你可以使用如下所述的  $this->db->trans_start()  和  $this->db->trans_complete()  函数:

$this->db->trans_start();
$this->db->query('一条SQL查询...');
$this->db->query('另一条查询...');
$this->db->query('还有一条查询...');
$this->db->trans_complete();

在 start/complete 函数之间, 你想运行多少条查询都可以, 根据任何给定查询的成功或失败, 它们将被提交或者回滚。

严格模式(Strict Mode)

默认情况下, CodeIgniter 以 严格模式 运行所有事务。当严格模式被启用时, 如果你正在运行多组的事务, 只要有一组失败, 所有组都会被回滚。如果严格模式被禁用, 每一组都被视为独立的组, 这意味着其中一个组的失败不会影响其它组。

严格模式能以下面的方式禁用:

$this->db->trans_strict(FALSE);

管理错误信息

如果你在你的  config/database.php  文件中启用了错误报告, 当提交没有成功时, 你会看到一条标准的错误信息。如果调试被关闭, 你可以通过这种方式来管理你的错误信息:

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE)
{
    // 生成一条错误信息... 或者使用 log_message() 函数来记录你的错误信息
}

禁用事务

当你使用  $this->db->trans_start()  时, 事务就已经被自动启用了。如果你想要禁用事务, 你可以使用  $this->db->trans_off()  来实现:

$this->db->trans_off()

$this->db->trans_start();
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

当事务被禁用的时候, 你的查询将被自动提交, 就像没有使用事务时那样。

测试模式(Test Mode)

你可以选择性地将事务系统设置到 "测试模式" , 这将导致你的查询被回滚 -- 尽管查询会生成有效结果。要使用测试模式, 只需将  $this->db->trans_start()  函数的第一个参数设置为  TRUE  即可:

$this->db->trans_start(TRUE); // 查询将被回滚
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

手动运行事务

如果你想要手动运行事务, 可以使用下面的方法:

$this->db->trans_begin();

$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');

if ($this->db->trans_status() === FALSE)
{
    $this->db->trans_rollback();
}
else
{
    $this->db->trans_commit();
}

说明:  手动运行事务时, 请务必使用  $this->db->trans_begin()  函数, 而 不是  $this->db->trans_start() .

最新文章

  1. 我有几个NUMA节点
  2. [转]Hibernate延迟加载与opensessioninviewFilter
  3. java线程同步 以及wait 和notify用法
  4. road习题(一)
  5. IIS7.5下发布应用程序备忘
  6. [OpenCV] Samples 02: [ML] kmeans
  7. 这个错误,每个ScrumMaster都犯过
  8. ajax使用
  9. Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用,后者必须先实例化后用实例调用)
  10. Listview之优化BaseAdapter中的getView中的contentView
  11. 【转】匹配dll(exe)和pdb方法
  12. 无锁,线程安全,延迟加载的单例实现(C#)
  13. /bin/bash^M: 坏的解释器: 没有那个文件或目录
  14. 你懂redis吗
  15. Python—requests模块详解
  16. centos7 防火墙
  17. 40. 数据泵导入导出impdp、expdp
  18. [leetcode]Interleaving String @ Python
  19. Python3基础 逻辑运算 and or not 示例
  20. RabbitMQ 一个demo

热门文章

  1. SQL注入科普
  2. CentOS 7.2重启网络报错 Failed to start LSB: Bring up/down
  3. Linux - iconv 使用 - 处理 curl 乱码问题
  4. Springboot启动报Multiple Dockets with the same group name are not supported. The following duplicate groups were discovered.
  5. Java基本修饰符
  6. ASP.NET Web Form 与 ASP.NET MVC 区别
  7. 20155218 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
  8. 21045234黄斐《java程序设计》第四周
  9. C# JSON和对象之间互相转换
  10. windows下安装,配置redis以及可视化客户端redisClient的安装及基本使用