【问题标题】:Symfony2 + Doctrine2 + SQL Server - Transaction SupportSymfony2 + Doctrine2 + SQL Server - 事务支持
【发布时间】:2012-05-17 17:44:49
【问题描述】:

我正在 Symfony2 中开发一个连接到 SQL Server 实例的私有企业应用程序。我在处理 SQL Server 时遇到了很多问题,但到目前为止我已经解决了它,直到现在。我正在使用 FreeTDS + DBLib 连接到 SQL Server 实例,并且此驱动程序不支持事务。这导致我遇到以下问题:

每次我尝试持久化一个对象时,Symfony(或 Doctrine)都会抱怨:

request.CRITICAL: 
    PDOException: 
        This driver doesn't support transactions (uncaught exception) at /.../Doctrine/DBAL/Connection.php line 858

我的第一个想法是禁用事务,因为我通过应用程序进行的数据修改很少。我已经通过 Doctrine's Documentation 搜索了该主题,但找不到任何相关信息。

所以,我的问题是:对于这种缺乏事务支持(一些配置选项,甚至编辑 Doctrine 的 DBAL 源)是否有任何解决方法。

并且:切换到 Propel 会更顺畅吗?我在他们的网站上读到他们支持 SQL Server,并且有关于如何配置 Propel 以便正确使用它的文档。

【问题讨论】:

    标签: sql-server transactions symfony doctrine-orm


    【解决方案1】:

    这是一个 PDO 异常,每当您尝试通过 PDO::beginTransaction() 在非事务性数据库上启动事务时都会引发此异常。

    Doctrine 通常会通过在工作单元内部将它们排队来处理事务,然后在 flush() 时将它们写为单个优化查询。

    不幸的是,当一个工作单元被提交(通过刷新)时,它似乎为你开始了一个事务。

    //UnitOfWork::commit($entity = null);
    $conn->beginTransaction();
    

    据我所知,它会在您使用的任何数据库驱动程序上暂停自动提交模式,并在您尝试持久化某些内容时触发您遇到的错误。

    简而言之,学说似乎不支持非事务性数据库交互。

    似乎有些人试图修改 Annotation 驱动程序以允许他们将引擎类型指定为非事务性的。不过,不确定这与底层 ORM 的效果如何。

    http://www.doctrine-project.org/jira/browse/DDC-972

    【讨论】:

    • 感谢您的解释。我真的没有深入研究 Doctrine 源代码中的 UnitOfWork 类,现在它变得更加清晰了。这是一步一步的集成,我发现它有很多问题。但是我发现了一个捆绑包(PDODblibBundle),它提供了驱动程序和连接类以与 MSSQL 一起使用,显然具有事务支持。我将尝试该方法并根据更具体的见解更新答案。 +1 的解释虽然。
    【解决方案2】:

    我发现我遇到的问题是因为我使用的驱动程序的日期时间格式。为了克服这个问题,我必须删除日期的 Timezone 部分,并覆盖捆绑引导代码中的 DateTimeType:

    \Doctrine\DBAL\Types\Type::overrideType(
        "datetime", 
        "Doctrine\DBAL\Types\VarDateTimeType"
    );
    
    \Doctrine\DBAL\Types\Type::overrideType(
        "date", 
        "Doctrine\DBAL\Types\VarDateTimeType"
    );
    

    我还分叉了学说的 dbal github 项目,以包含一个使用 dblib 作为连接代理的自定义驱动程序。根据我的项目的依赖关系,将教义-dbal 锁定到版本 2.1.6,我创建了版本 2.1.6-dblib,您可以在任何时候使用 dblib 的驱动程序。

    我在我的 fork 中使用了 PDODblibBundle 的代码库。在其Connection 类中,执行了BEGIN TRANSACTION 命令,但我相信回滚是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多