В некотором контексте. У меня есть контроллер для управления сайтами. Сайты могут участвовать в исследовании. Когда сайт участвует в исследовании, создается пустой объект съемки. Участие имеет ссылку на этот опрос.Codeigniter 3 последовательных транзакции не работают
Упрощенная версия кода контроллера:
$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
Не только делает вставки участия имеют ни начала транзакции и не совершать, но код возвращает успешную операцию (весьма обманчивое) и запрос без транзакции на самом деле делает не делайте вставки. В таблице нет записи участия, но индекс автоматически увеличивается. Это похоже на то, что второй упор продолжался, и произошел запуск транзакции и откат, который не отображается в журнале mysql. Однако, если я вручную копирую запрос в журнале mysql и выполняю его, вставка работает, и запись добавляется в таблицу.
Я спросил на форумах CI и искал похожие проблемы, но ничего не нашел.
- Если я не использовать транзакции, он работает (не решение для меня)
- Я попытался как автоматические транзакции CI и ручные те, с теми же результатами.
- Это не проблема модели. Если вместо того, чтобы вставлять опрос, а затем вставлять участие, я пытаюсь вставить два участия, фактически добавляется только первый.
- У меня не было этой ошибки в CI v2, которая заставляет меня задаться вопросом, является ли это ошибкой с v3, но я считаю маловероятным, что никто бы не столкнулся с этой проблемой раньше, поскольку это очень простая операция.
У меня кончились идеи, чтобы проверить, почему это не работает, и может использовать какой-либо вклад от кого-то, кто имеет внешний вид и/или опыт, с тем, как CI3 обрабатывает транзакции.
Какая версия 3.0.x вы используете? – Narf
Я использую версию 3.0.4 – Deratrius
Я только что протестировал с той же версией и не могу воспроизвести поведение. – Narf