Bacysoft.cn

 找回密码
 邀请注册
查看: 25866|回复: 1
打印 上一主题 下一主题

Discuz!X 支持 InnoDB 事务处理的方法简介

[复制链接]
跳转到指定楼层
楼主
发表于 2016-7-11 16:08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Discuz!X 默认的数据库引擎是 MyISAM,对于以内容展示为主的页面模型来说,采用 MyISAM 会有相对较好的性能。但是 MyISAM 不支持事务处理,因此涉及到订单处理这类对数据一致性要求较高的业务模型就有些力不从心了。InnoDB 作为 MySQL 5.x 默认的数据库引擎对事务处理提供了很好的支持。
Disucz!X 数据库驱动的原生封装不支持事务处理,因此如果基于 Discuz!X 开发需要事务处理的业务,需要自行处理与事务相关的内容,本文将介绍最基本的让 Discuz!X 支持事务处理的方法。

首先,Disucz!X 提供了两个版本的数据库驱动:mysql 和 mysqli(源码位于目录:./source/class/db),当 PHP 环境同时支持 mysql 和 mysqli 时,Discuz!X 会优先选择 mysql。但实际上如果服务器的 PHP 环境不支持 mysql,Discuz!X 将根本无法运行!换句话说当前所有版本的 Discuz! 都仅能使用 mysql,mysqli 就是摆设而已(真心不理解为何要这样做!)。要支持事务处理,就必须使用 mysqli,不过好在用户可以自定义需要使用的驱动版本,通过如下代码实现:
  1. DB::init("db_driver_mysqli",$_G['config']['db']);
复制代码
在此语句后面所有的 C::t() 调用都将使用 mysqli 接口。以下是一段完整支持事务处理的代码:
  1. DB::init("db_driver_mysqli",$_G['config']['db']);

  2. $rand = rand(100,999);

  3. DB::$db->curlink->autocommit(false);

  4. C::t("#test#bacysoft_data")->insert(array(
  5.         'str' => $rand,
  6. ));

  7. if ( $rand % 2 == 0 ) {
  8.         DB::$db->curlink->rollback();
  9. } else{
  10.         DB::$db->curlink->commit();
  11. }
复制代码
这段代码先生成一个随机数,然后作为一条新记录插入数据表,接着判断随机数是否为偶数,如果是偶数则回退,奇数则提交。也就是说运行这段代码后,数据表中只有奇数值,偶数值都被取消了。

如果应用使用了 Discuz!X 的分布式部署功能,那么在使用事务处理之前,必须先将对应的数据库连接对象实例化。参考代码:
  1. DB::table("bacysoft_data");
复制代码
或者
  1. DB::$db->connect(2);
复制代码
这里假定数据表 bacysoft_data 映射到了数据库2上面,参考配置文件:
  1. $_config['db']['map']['bacysoft_data'] = '2';
复制代码

本文提供的代码应运行与独立的 Discuz!X 插件。另外就是:与事务处理相关的数据表应该放在相同的数据库里面,也就是其 map 配置应该指向相同的数据库编号。

(Over)
沙发
 楼主| 发表于 2017-8-29 14:46:43 | 只看该作者

PHP7 环境下 Dz 已经默认使用 "db_driver_mysqli"

因此,DB::init("db_driver_mysqli",$_G['config']['db']); 应该是可以不用了。(待验证)
您需要登录后才可以回帖 登录 | 邀请注册

本版积分规则



京ICP备08000958号-1|腾讯云|阿里云|联系方式|Bacysoft.cn

GMT+8, 2024-12-21 21:02 , Processed in 0.014350 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表