【问题标题】:Codeigniter 3 consecutive transactions not workingCodeigniter 3个连续事务不起作用
【发布时间】:2016-06-15 14:49:43
【问题描述】:

首先是一些上下文。我有一个控制器来管理站点。站点可以参与研究。当站点参与研究时,会创建一个空的调查对象。参与具有该调查的链接。

控制器代码的简化版:

$survey = new Survey();
//Set some variables

$savedSurvey = $this->Surveymodel->persist($survey);

if ($savedSurvey) 
    $participation->survey_id = $savedSurvey->id; 

$savedParticipation = $this->Participationmodel->persist($participation);

persist 函数相当简单,所有模型看起来都一样。

$sql = "INSERT INTO table (a, b, c) VALUES (?, ?, ?)";
$params = array($object->a, $object->b, $object->c);

$this->db->trans_start();
$this->db->query($sql, $params);
$object->id = $this->db->insert_id();
$this->db->trans_complete();

if ($this->db->trans_status() === FALSE) {
    error_log('SURVEY INSERT KO');
    return false;
} else {
    error_log('SURVEY INSERT OK');
    return $object;
}

这是直接的事务使用,与 CI 文档中的描述完全相同。 PHP 错误日志显示调查已成功插入,参与也已成功插入。然而,mysql 日志却描绘了一个不同的故事:

55 Query    START TRANSACTION
55 Query    INSERT INTO survey (survey_class_id, status, created_at) 
                   VALUES ('2', 1, NOW())
55 Query    COMMIT
55 Query    INSERT INTO participation (study_id, site_id, fs_folder_id, survey_id, reference, created_at) 
                   VALUES (1, '33', NULL, 49, 'REDVILLE', NOW())
55 Quit

参与插入不仅没有事务启动和提交,而且代码返回一个成功的操作(相当误导)并且没有事务的查询实际上并没有进行插入。表中没有参与记录,但自动索引递增。就好像第二次持久化实际上失败了,并且有一个事务启动和一个回滚,没有显示在 mysql 日志中。但是,如果我手动复制 mysql 日志中的查询并执行它,则插入工作并将记录添加到表中。

我在 CI 论坛上问过,也搜索过类似的问题,但没有找到任何东西。

  1. 如果我不使用事务,它可以工作(对我来说不是解决方案)
  2. 我尝试了自动 CI 事务和手动 CI 事务,结果相同。
  3. 这不是型号问题。如果我尝试插入两个参与而不是插入调查,然后插入参与,则实际上只添加了第一个。
  4. 我在 CI v2 中没有这个错误,这让我想知道这是否是 v3 的一个错误,但我发现以前没有人会遇到这个问题,因为这是一个非常基本的操作。

我没有想法来测试为什么这不起作用,并且可以使用具有外部外观和/或 CI3 处理事务方式经验的人的一些输入。

【问题讨论】:

  • 你运行的是哪个 3.0.x 版本?
  • 我使用的是3.0.4版本
  • 我只是用相同的版本测试,无法重现该行为。
  • @Narf 不知道你做了什么,因为我复制了 CI v3.0.4 的一个干净副本,创建了一个只有一种方法在表中插入项目的模型,在 Welcome.php 中添加了一个循环控制器连续创建 3 个项目,我得到了完全相同的错误。
  • 我做的基本一样,只是我没有使用模型。

标签: php mysql codeigniter transactions


【解决方案1】:

将我的 php 版本从 5.5.10 升级到 5.6.10 时,Bug 消失了

为了更准确地估计修复错误的版本,我尝试了 PHP 5.5.22,它可以工作(在 MAMP 和 5.5.10 之间找不到任何东西)。

我检查了 PHP ChangeLog 并注意到版本 5.5.12:

mysqli:修复了 mysqli_commit()/mysqli_rollback() 中第二个参数(额外的逗号)和第三个参数(缺少转义)的问题。

这没有链接到任何进一步的详细信息,但它是更改日志中唯一似乎与我的问题相关并且与我有错误的版本相匹配的内容(5.5.10 之前和 5.5.22 之后)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2011-11-20
    相关资源
    最近更新 更多