Symfony 4注册表第二次提交"已经有一个活跃的交易"

Cyb*_*101 5 php registration symfony

我已经创建了一个用户注册表,就像在文档中一样.稍后我想添加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/*
Run Code Online (Sandbox Code Playgroud)

这没有用.

当我填写表格并提交.如果用户已保存.我第二次,我收到下面的错误消息.

只有当我在浏览器中删除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)
Run Code Online (Sandbox Code Playgroud)

我试着调试一下.交易在某处激活,然后不再激活.我找不到问题.有人能帮助我吗?

的symfony /配置/ 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 }
Run Code Online (Sandbox Code Playgroud)

小智 20

我最近遇到了同样的问题,对我而言,这与使用PDOSessionHandler共享Doctrine连接有关getWrappedConnection.

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

Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
    arguments:
        - !service { class: PDO, factory: 'database_connection:getWrappedConnection' }
        - { lock_mode: 1 }`
Run Code Online (Sandbox Code Playgroud)

即仅添加lock_mode参数.虽然我正在更深入地了解为什么使用LOCK_TRANSACTIONAL而不是LOCK_ADVISORY,但这对我"固定"了.