2012-05-17 3 views
3

Я разрабатываю частное корпоративное приложение в Symfony2, которое подключается к экземпляру SQL Server. У меня было много проблем при работе с 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 

Мой первый, хотя должен был отключить транзакции, как модификация данных я делаю через приложение минимально. Я искал эту тему над документацией Доктрины, но я не мог найти никакой соответствующей информации.

Итак, мой вопрос: существует ли какое-либо обходное решение для этого отсутствия поддержки транзакций (какой-либо вариант конфигурации или даже редактирование источника DBAL Доктора).

И: Будет ли более гладким просто переключиться на Propel? Я прочитал на своем веб-сайте, что они поддерживают SQL Server и имеют документацию о том, как настроить Propel для правильного использования.

ответ

1

Это исключение PDO, которое вызывается при попытке начать транзакцию в не транзакционной базе данных через PDO :: beginTransaction().

Doctrine, как правило, обрабатывает транзакции, размещая их внутри внутри единицы работы, а затем записывая их как один оптимизированный запрос на flush().

К сожалению, когда часть работы совершена (через флеш), она начинает совершать транзакцию для вас.

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

который, насколько я могу сказать приостановит автофиксации режим на любой драйвер DB вы используете и вызывает ошибку при получении вашей всякий раз, когда вы пытаетесь что-то упорно.

Вкратце, не представляется, что доктрина поддерживает взаимодействие с транзакционными базами данных.

Похоже, что некоторые пытались возиться с драйвером Annotation, чтобы они могли указывать тип двигателя, который не является транзакционным. Не уверен, насколько хорошо это будет работать с базовым ORM.

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

+0

Благодарим вас за разъяснение. Я действительно не копался в классе 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.

Я использовал codebase в своей вилке. В своем классе Connection выполняется команда BEGIN TRANSACTION, но откат невозможен, я считаю.

Смежные вопросы