2012-05-17 38 views
3

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

每次我试图坚持一个对象,Symfony的(或学说)抱怨:

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

我的第一个虽然是禁止交易的数据修改我通过做该应用程序是最小的。我已经通过Doctrine的文档搜索了这个主题,但我找不到任何相关信息。

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

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

回答

1

这是一个PDO异常,只要您尝试通过PDO :: beginTransaction()在非事务性数据库上启动事务,就会引发这种异常。

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

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

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

其中,据我可以告诉就什么DB驱动你,挂起使用自动提交模式,并触发你得到时,你试图坚持一些错误。

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

看起来有些人试图鼓励Annotation驱动程序允许他们指定引擎类型为非事务性的。不知道这对于底层ORM有多好。

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

+0

谢谢你的解释。在Doctrine的源代码中,我真的没有深入研究UnitOfWork类,现在它变得更加清晰。这是一步一步的整合,我发现它有很多问题。但是我发现了一个捆绑包(PDODblibBundle),它提供了驱动程序和连接类以便与MSSQL一起工作,显然具有事务支持。我会尝试该方法,并根据更具体的见解更新答案。 +1的解释,但。 – Tiago

0

我才发现原来我是有这个问题是因为日期时间格式我用的是司机只好的。为了克服我不得不删除的日期时区的部分问题,并覆盖在束引导代码的DateTimeType:

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

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

我还分叉学说的DBAL GitHub的项目包括使用DBLIB为自定义驱动器一个连接代理。继我的项目依赖关系之后,将doctrine-dbal锁定到版本2.1.6,我创建了版本2.1.6-dblib,您可以随时使用dblib的驱动程序。

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