原则嵌套事务的用例

Uses cases for doctrine nested transactions

我有一个项目需要进行交易,因为我有 3 个相互依赖的实体。租户、组织、用户。 首先,我从一个存储库上的单个事务开始,然后我发现了学说嵌套事务。 我不太了解它们在教义中的作用以及用例是什么。 您能否比他们的文档更详细地向我解释用例是什么以及它是否适用于我的案例?

在我的例子中,用户需要一个组织 ID、租户 ID,而组织需要一个租户 ID。 如果创建实体之一由于某种动机失败,它应该使所有三个实体都失败并回滚。

LE:我在 symfony 中使用 doctrine。

嵌套事务文档中的示例:

<?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;
}

如果你正在使用 Doctrine ORM(你没有在你的问题中透露),我不明白你为什么在这种情况下使用交易。

如果您定义实体之间的关联,例如

/** @Entity */
class User
{

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

这已经确保只有在设置组织时才会保留用户实体。如果不是这种情况,则会抛出错误并且不会保留或回滚。

因此,如果您能够以这种方式定义您的关联,则不需要交易。

只有在您无法定义此类技术关联链的情况下才需要交易。例如。当一个组织和一个用户需要一起创建,但他们之间没有技术关联时。