[s2container-php5:141] Re: S2DaoをMSSQLでトランザクションではまっています

masami sakamaki [E-MAIL ADDRESS DELETED]
2008年 10月 20日 (月) 10:21:26 JST


Kloveさん

自前で発行は私も発見しました。

ここで良い対策が見つからなければ、同じ方法で対処しようと思っておりました。

時間的には余裕があるので、もうしばらく待って(ここで他に良いアイデアが
出てくるのを待って)から対応しようおともいます。


-----Original Message-----
From: [E-MAIL ADDRESS DELETED]
[mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of klove
Sent: Friday, October 17, 2008 10:07 PM
To: [E-MAIL ADDRESS DELETED]
Subject: [s2container-php5:140] Re: S2DaoをMSSQLでトランザクションではまって
います

kloveです。
MSSQLを使用したことはないのですが、Zend_Dbのアダプタでは、
BEGIN TRANSACTIONを自前で発行しています。

http://framework.zend.com/code/browse/~raw,r=9101/Zend_Framework/trunk/libra
ry/Zend/Db/Adapter/Pdo/Mssql.php

    /**
     * Begin a transaction.
     *
     * It is necessary to override the abstract PDO transaction
functions here, as
     * the PDO driver for MSSQL does not support transactions.
     */
    protected function _beginTransaction()
    {
        $this->_connect();
        $this->_connection->exec('BEGIN TRANSACTION');
        return true;
    }

s2daoのS2Dao_AbstractTxInterceptorで
https://www.seasar.org/svn/s2dao.php5/tags/S2Dao.PHP5-1.1.2/src/s2dao.php5/o
rg/seasar/extension/tx/S2Dao_AbstractTxInterceptor.class.php
  - connection->beginTransaction()
  - connection->commit()
  - connection->rollback()
をZend_Dbのようにexecで発行するように編集するとトランザクションが
効くのではないかと思います。(実際に試してないです。)
よろしくお願いいたします。

masami sakamaki さんは書きました:
> masasと申します。
>
> S2DaoをMSSQLで使っていてトランザクションがうまく動かず困っています。
>
> s2:1.2.0
> s2dao:1.1.2
> DBドライバ:pdo_dblib
> トランザクション: requiredTx
>
> トランザクションをPointCutで指定して、そのメソッドを呼び出します。
> メソッドの中では、daoのインスタンスからinsertを2回行っています。
> 1回目のinsertは成功し、2回目のinsertは失敗するのですが
> (例外が発生し、PointCutしているメソッドでは例外処理は何もしていない)
> このとき、1回目のinsertの分がデータベースに入ってしまいます。
>
> どうやらトランザクションが聞いていないように思われます。
>
> よくよく見ていると
>     public final function hasTransaction() {
>      if($this->begin){
>             return $this->begin;
>         }
>         try {
>             $this->connection->beginTransaction();
>         } catch(Exception $e){
>             $this->begin = true;
>             return true;
>         }
>         return false;
>     }
>> $this->connection->beginTransaction();
> で例外が発生していました
> ('PDOException' with message 'This driver doesn't support transactions'
> in)
> これはDBのライブラリがbeginTransactionをサポートしていないのは
> 解るのですが、どなたか同じような経験とかで回避した方法などを
> ご存じでしたらアドバイスをいただけると助かります。
>
> よろしくお願いいたします。
>
>
> _______________________________________________
> S2Container-PHP5 mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/s2container-php5
>

_______________________________________________
S2Container-PHP5 mailing list
[E-MAIL ADDRESS DELETED]
https://ml.seasar.org/mailman/listinfo/s2container-php5





S2Container-PHP5 メーリングリストの案内