Symfony 4 注册表第二次提交 "There is already an active transaction"

Symfony 4 registration form second submit "There is already an active transaction"

我已经按照文档中的说明创建了一个用户注册表。 稍后我想添加 CSRF。从那以后它就不能正常工作了。我安装并删除了软件包。 https://symfony.com/doc/current/doctrine/registration_form.html

composer require security-csrf
composer remove security-csrf
rm -rf vendor
rm -rf var/cache/*

这没有帮助。

当我填写表格并提交时。如果用户被保存。 我做了第二次,我收到以下错误消息。

只有当我在浏览器中删除 cookie "PHPSESSID" 时,我才能再次发送表单。之后又是同样的问题。

PDOException:
There is already an active transaction

  at vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:1249
  at PDO->beginTransaction()
     (vendor/doctrine/dbal/lib/Doctrine/DBAL/Connection.php:1249)
  at Doctrine\DBAL\Connection->beginTransaction()
     (vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:376)
  at Doctrine\ORM\UnitOfWork->commit(null)
     (vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:358)
  at Doctrine\ORM\EntityManager->flush()
     (src/Controller/RegistrationController.php:40)
  at App\Controller\RegistrationController->registerAction(object(Request), object(UserPasswordEncoder))
     (vendor/symfony/http-kernel/HttpKernel.php:149)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (vendor/symfony/http-kernel/HttpKernel.php:66)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor/symfony/http-kernel/Kernel.php:190)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (public/index.php:37)

我试图调试它。交易在某处被激活,然后又没有。我找不到问题所在。有人能帮我吗?

symfony/config/services.yaml

services:
    Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
        arguments:
            - !service { class: PDO, factory: 'database_connection:getWrappedConnection' }
            - { db_table: session, db_username: username, db_password: password }

我最近遇到了同样的问题,对我来说,这归结为使用 PDOSessionHandler 以及与 getWrappedConnection 共享 Doctrine 连接。

在您的 services.yaml 中更改您的 PdoSessionHandler 服务定义

Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
    arguments:
        - !service { class: PDO, factory: 'database_connection:getWrappedConnection' }
        - { lock_mode: 1 }`

即只需添加 lock_mode 参数即可。 "fixed" 对我来说是这样,尽管我正在更深入地研究为什么使用 LOCK_TRANSACTIONAL 而不是 LOCK_ADVISORY。