Codeigniter连续3次交易无效

时间:2016-03-02 16:12:40

标签: php mysql codeigniter transactions

首先是一些背景。我有一个控制器来管理网站。网站可以参与研究。当站点参与研究时,会创建一个空的调查对象。参与与该调查有关。

控制器代码的简化版本:

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

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

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

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

持久性功能相当简单,所有型号看起来都一样。

$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

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

我已经在CI论坛上询问并搜索了类似的问题,但没有找到任何东西。

  1. 如果我不使用交易,它可以运作(对我来说不是解决方案)
  2. 我尝试过自动CI交易和手动交易,结果相同。
  3. 这不是一个模型问题。如果不插入调查然后插入参与,我尝试插入两个参与,实际上只添加了第一个。
  4. 我在CI v2中没有这个错误,这让我想知道它是否是v3的一个错误,但我发现之前没有人会遇到这个问题因为它非常基本操作。
  5. 我没有想法来测试为什么它不起作用,并且可以使用具有外部外观和/或经验的人对CI3处理事务的方式的输入。

1 个答案:

答案 0 :(得分:1)

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

为了尝试更准确地估计修复错误的版本,我尝试了PHP 5.5.22,它起作用了(在MAMP之间无法得到任何东西)。

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

  

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

哪个链接到任何进一步的细节,但是在更改日志中唯一与我的问题相关并且与我有错误的版本匹配(在5.5.10之前和5.5之后)。 22)。