3

SQL Server インスタンスに接続する Symfony2 でプライベート エンタープライズ アプリケーションを開発しています。私は 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 のドキュメントでこの件について検索しましたが、関連する情報は見つかりませんでした。

それで、私の質問は次のとおりです。このトランザクションサポートの欠如に対する回避策はありますか(いくつかの構成オプション、またはDoctrineのDBALソースの編集さえも)。

そして: Propel に切り替えるだけでスムーズになりますか? 私は彼らのウェブサイトで彼らが SQL Server をサポートしていることを読み、それを正しく使用するために Propel を構成する方法に関するドキュメントを持っています。

4

2 に答える 2

1

This is a PDO exception that's thrown whenever you try to start a transaction on a non-transactional database via PDO::beginTransaction().

Doctrine will typically handle transactions by queuing them up internally in a unit of work, and then writing them as a single optimised query upon flush().

Unfortunaly when a unit of work is commited (via flush) it appears to begin a transaction for you.

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

Which as far as I can tell suspends auto-commit mode on whatever DB driver you're using and triggers the error your getting whenever you attempt to persist something.

In short it doesn't appear that doctrine supports non-transactional database interactions.

It appears some have tried to tinker with the Annotation driver to allow them to specify the engine type to be non-transactional. Not sure how well this would work with the underlying ORM though.

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

于 2012-05-18T13:43:26.170 に答える
0

私が抱えていた問題は、使用していたドライバーの日時形式が原因であることがわかりました。この問題を解決するには、日付のタイムゾーン部分を削除し、バンドル ブートストラップ コードで DateTimeType をオーバーライドする必要がありました。

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

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

また、doctrine の dbal github プロジェクトをフォークして、接続プロキシとして dblib を使用するカスタム ドライバーを含めました。doctrine-dbal をバージョン 2.1.6 にロックした私のプロジェクトの依存関係に従って、バージョン2.1.6-dblibを作成しました。これは、dblib のドライバーを利用可能にしたいときにいつでも使用できます。

フォークでPDODblibBundleのコードベースを使用しました。そのConnectionクラスでは、BEGIN TRANSACTIONコマンドが実行されますが、ロールバックは不可能だと思います。

于 2012-05-23T13:55:02.450 に答える