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

标签 php symfony registration

我已经按照文档中的说明创建了一个用户注册表。 稍后我想添加 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 参数。这为我“修复”了它,尽管我正在更深入地研究为什么使用 LOCK_TRANSACTIONAL 而不是 LOCK_ADVISORY 会更好。

关于php - Symfony 4 注册表第二次提交 "There is already an active transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452223/

相关文章:

python - Django:尝试制作自定义表单时出现 RelatedObjectDoesNotExist 错误

ios - 从 ios 应用程序在 QuickBlox 中注册新用户时终止应用程序

php - 如何在 MySQL 中创建区分大小写的 'select' 和 'like'?

forms - Symfony2 : How to pass parameters to form collections

php - 根据年、月和我的自定义编号在 mysql 中创建一个 ID 列

php - 将动态生成的表单嵌入到另一个表单中

php - Twig+ Wordpress - 如何将数组参数传递给函数?

php - 在 Laravel 中向注册表单添加字段不起作用

javascript - 使用 JS 从 PHP 导入图表列的值

php - 如何通过 Selenium 找到元素