首先是一些背景。我有一个控制器来管理网站。网站可以参与研究。当站点参与研究时,会创建一个空的调查对象。参与与该调查有关。
控制器代码的简化版本:
$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论坛上询问并搜索了类似的问题,但没有找到任何东西。
我没有想法来测试为什么它不起作用,并且可以使用具有外部外观和/或经验的人对CI3处理事务的方式的输入。
答案 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)。