Прерывает ли выполнение транзакцию PDO?

0

Я пишу пользовательский ввод в 2 таблицы MySQL следующим образом:

(a) вставить некоторые данные в таблицу-A,

(b) получить lastInsertId,

(c) вставить другие данные в таблицу-B.

Я имею:

            $this->conn->beginTransaction();
            $stmt = $this->conn->prepare("
                    INSERT INTO requests
                        ($creation_date, etc...) // some data 
                        VALUES(:creation_date, etc..);"); // some values


            $stmt->bindparam(":creation_date",$creation_date);
            ...

            $stmt->execute();

На данный момент, в конечном счете, мне нужно только получить lastInsertId, но, похоже, он становится доступным только после первого $stmt->execute() поскольку в противном случае он возвращает 0 из-за того, что определенные действия в транзакции не были физически запущены ( пожалуйста, подтвердите, если в противном случае).

Дальнейший код:

            $lastInsertId = $this->conn->lastInsertId();

            $stmt = $this->conn->prepare("
                    INSERT INTO other_requests
                        (requests_id,...) // some more data 
                        VALUES(:requests_id,...);"); // some more values

            $stmt->bindparam(":requests_id", $lastInsertId);
            $stmt->bindparam(...); // some more bindings
            $stmt->execute();
            $this->conn->commit();

Вопросы:

  1. Меня беспокоит, если первый $stmt->execute(); в середине кода транзакции каким-то образом прерывает транзакцию. Я понимаю, что он не должен, но до сих пор не нашел никаких хороших доказательств этому.

  2. Я ищу более элегантное решение, поскольку в настоящее время кажется, что слишком много кода для простой задачи.

Спасибо за любые советы

Теги:
pdo

1 ответ

2
Лучший ответ

Выполняет ли выполнение транзакции PDO?

Нет.

execute() - выполнить запрос. без execute() ваш запрос не будет выполнен. Если запрос не выполняется, информация не будет храниться в базе данных. Без информации, хранящейся в базе данных, никакая транзакция никогда не будет иметь смысла. Следовательно, чтобы иметь транзакцию, вам необходимо сохранить данные в базе данных. Чтобы сохранить данные в базе данных, вы должны выполнить запрос. Чтобы выполнить запрос, вы должны вызвать execute().

Надеюсь, теперь все ясно.

  • 0
    спасибо, теперь все понятно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню