【发布时间】: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 论坛上问过,也搜索过类似的问题,但没有找到任何东西。
- 如果我不使用事务,它可以工作(对我来说不是解决方案)
- 我尝试了自动 CI 事务和手动 CI 事务,结果相同。
- 这不是型号问题。如果我尝试插入两个参与而不是插入调查,然后插入参与,则实际上只添加了第一个。
- 我在 CI v2 中没有这个错误,这让我想知道这是否是 v3 的一个错误,但我发现以前没有人会遇到这个问题,因为这是一个非常基本的操作。
我没有想法来测试为什么这不起作用,并且可以使用具有外部外观和/或 CI3 处理事务方式经验的人的一些输入。
【问题讨论】:
-
你运行的是哪个 3.0.x 版本?
-
我使用的是3.0.4版本
-
我只是用相同的版本测试,无法重现该行为。
-
@Narf 不知道你做了什么,因为我复制了 CI v3.0.4 的一个干净副本,创建了一个只有一种方法在表中插入项目的模型,在 Welcome.php 中添加了一个循环控制器连续创建 3 个项目,我得到了完全相同的错误。
-
我做的基本一样,只是我没有使用模型。
标签: php mysql codeigniter transactions