在Symfony中哪里初始化Doctrine的默认事务隔离级别?

问题描述 投票:0回答:1

我想在整个Symfony应用程序中将默认事务隔离级别设置为READ COMMITTED,而不是MySQL的默认REPEATABLE READ

基本上,每次注入此类时,我需要确保在Doctrine\DBAL\Connection上调用以下方法:

$connection->setTransactionIsolation(TransactionIsolationLevel::READ_COMMITTED);

在Symfony应用程序中正确的位置是什么?我虽然是关于Kernel的,但是不确定如何无须实例化Connection的情况。

相反,这仅应称为if,并且when Connection由依赖项注入容器实例化。

php symfony doctrine-orm symfony4
1个回答
2
投票

我不认为有可用的配置选项来控制捆绑级别的事务隔离。

但是可以修饰Doctrine\Bundle\DoctrineBundle\ConnectionFactory,并在createConnection()上设置事务隔离级别,然后返回创建的连接。

# services.yaml
    App\YourOwnConnectionFactory:
        decorates: '@doctrine.dbal.connection_factory'
class YourOwnConnectionFactory
{
    private ConnectionFactory $decorated;

    public function __construct(ConnectionFactory $decorated) {
        $this->decorated = $decorated;
    }

    public function createConnection(array $params, Configuration $config = null, EventManager $eventManager = null, array $mappingTypes = []) {
        $connection = $this->decorated->createConnection($params, $config, $eventManager, $mappingTypes);
        $connection->setTransactionIsolation(TransactionIsolationLevel::READ_COMMITTED);
        return $connection;
    }
}

您还可以更改doctrine.dbal.connection的定义,以在编译器遍历中添加对setTransactionIsolation()的调用。不知道会不会更好。我猜这两种方法都有其缺点,您需要根据自己的情况进行评估:

class FooPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
            $container
                ->getDefinition('doctrine.dbal.default_connection')
                ->addMethodCall(
                    'setTransactionIsolation',
                    [TransactionIsolationLevel::READ_COMMITTED]
                );

    }
}

还有另一种选择是使用向编译器通道添加配置器功能:

class FooPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $container
            ->getDefinition('doctrine.dbal.default_connection')
            ->setConfigurator([self::class, 'setTransactionIsolationLevel']);
    }

    public static function setTransactionIsolationLevel(Connection $connection) : void
    {
        $connection->setTransactionIsolation(TransactionIsolationLevel::READ_COMMITTED);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.