Использует кейсы для doctrine вложенных транзакций - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть проект, в котором мне нужно сделать транзакцию, потому что у меня есть 3 сущности, которые зависят друг от друга. Арендатор, Организация, Пользователь. Сначала я начал с одной транзакции в одном из репозиториев, а затем узнал о doctrine вложенных транзакциях. Я не совсем понял их роль в doctrine и каковы варианты использования. Можете ли вы объяснить мне более подробно, чем их документацию, каковы варианты использования и применимо ли это к моему случаю?

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

LE: Я использую doctrine с symfony.

Пример из документации вложенная транзакция:

<?php
// $conn instanceof Doctrine\DBAL\Connection
$conn->beginTransaction(); // 0 => 1, "real" transaction started
try {

    ...

    // nested transaction block, this might be in some other API/library code that is
    // unaware of the outer transaction.
    $conn->beginTransaction(); // 1 => 2
    try {
        ...

        $conn->commit(); // 2 => 1
    } catch (\Exception $e) {
        $conn->rollBack(); // 2 => 1, transaction marked for rollback only
        throw $e;
    }

    ...

    $conn->commit(); // 1 => 0, "real" transaction committed
} catch (\Exception $e) {
    $conn->rollBack(); // 1 => 0, "real" transaction rollback
    throw $e;
}

1 Ответ

0 голосов
/ 15 апреля 2020

Если вы работаете с Doctrine ORM (который вы не раскрываете в своем вопросе), я не понимаю, почему вы работаете с транзакциями в этом случае.

Если вы определяете связи между ваши сущности, такие как

/** @Entity */
class User
{

 /**
 * @ManyToOne(targetEntity="Organisation", nullable=false)
 */
private $organization;

, это уже гарантирует, что сущность пользователя будет сохраняться только тогда, когда установлена ​​организация. Если это не так, выдается ошибка, которая не сохраняется и не откатывается.

Так что, если вы сможете определить свои ассоциации таким образом, транзакция не потребуется.

A Транзакция потребуется только в тех случаях, когда вы не можете определить такую ​​техническую цепочку ассоциаций. Например, когда организация и пользователь должны быть созданы вместе, но между ними нет технической ассоциации.

...