2016-03-02 2 views
3

В некотором контексте. У меня есть контроллер для управления сайтами. Сайты могут участвовать в исследовании. Когда сайт участвует в исследовании, создается пустой объект съемки. Участие имеет ссылку на этот опрос.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 и искал похожие проблемы, но ничего не нашел.

  1. Если я не использовать транзакции, он работает (не решение для меня)
  2. Я попытался как автоматические транзакции CI и ручные те, с теми же результатами.
  3. Это не проблема модели. Если вместо того, чтобы вставлять опрос, а затем вставлять участие, я пытаюсь вставить два участия, фактически добавляется только первый.
  4. У меня не было этой ошибки в CI v2, которая заставляет меня задаться вопросом, является ли это ошибкой с v3, но я считаю маловероятным, что никто бы не столкнулся с этой проблемой раньше, поскольку это очень простая операция.

У меня кончились идеи, чтобы проверить, почему это не работает, и может использовать какой-либо вклад от кого-то, кто имеет внешний вид и/или опыт, с тем, как CI3 обрабатывает транзакции.

+0

Какая версия 3.0.x вы используете? – Narf

+0

Я использую версию 3.0.4 – Deratrius

+0

Я только что протестировал с той же версией и не могу воспроизвести поведение. – Narf

ответ

1

ошибка исчезла при обновлении моей версии PHP от 5.5.10 до 5.6.10

Для того, чтобы попытаться получить более точную оценку версии исправления ошибки я попробовал PHP 5.5.22, который работает (не мог 't получить что-нибудь между этим и 5.5.10 для MAMP).

Я проверил PHP ChangeLog и заметил это для версии 5.5.12:

Mysqli: Исправлена ​​проблема в mysqli_commit()/mysqli_rollback() со вторым параметром (лишняя запятая) и третьего параметров (отсутствие побега).

Который не связывает какие-либо дополнительные детали, но это единственное, что в журналах изменений, которые, кажется, связанные с моим вопросом, и что соответствует версии, для которых у меня есть ошибка (до 5.5.10 & после 5.5. 22).

Смежные вопросы