2012-05-17 74 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命令,但我相信回滾是不可能的。