2012-12-12 20 views

答えて

21

不明なドキュメントは興味があります。

私は何が起こったのかを知るために、Zend \ Db \ AdapterのAPI docsに入っていなければなりませんでした。

Zend\Db\Adapter\Driver\ConnectionInterfaceには、,rollbackcommitが定義されています。つまり、これらのメソッドはすべての単一のアダプタ接続で呼び出し可能です。残念なことに、接続自体はむしろ埋もれています。

私は明確ではない - この時点では例を提示することはできませんが、これらのメソッドを実際に呼び出すオブジェクトを特定しています。最悪の場合は、$adapter->getDriver()->getConnection()->beginTransaction()に電話すると思われます。

Eww。

もっと知りたい方、便利なZF2のコピーをお探しの方は、このオプションをお勧めします。

あなた自身がBEGIN TRANSACTION/ROLLBACK/COMMIT/SET autocommit=...のSQL文を自分で発行できることを忘れないでください。これはおそらくです.Zend \ Dbはトランザクション状態を追跡しているようには見えません。

+0

多くの方々に感謝します。チャールズ - 私はAPIを慎重に読んで読んでいく必要があります。最終的にこれらを発行するにはPDOを使って直接作業してください。 –

35

あなたはそれを持っています。適切な方法は、開始、コミット、および以下のようにロールバックトランザクションがあるする:あなたが使用している場合は

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue() 

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 

$this->getAdapter()->getDriver()->getConnection()->commit(); 

$this->getAdapter()->getDriver()->getConnection()->rollback(); 

はあまりにもあなたもによって作成された最後のIDを取得することができますが、これを出すためにpgSQLシーケンスを追加して、作成した最終IDを返す必要があります:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq') 
+2

ありがとう@Diemuzi - これは本当に便利です。 –

+0

この素晴らしい、よく説明されて、多くの感謝!! ZF2とZF3のドキュメントはこの部分についてはっきりしていません! – evilReiko

8

トランザクションを行う上で2つの問題があります。
1 - MyISAMはトランザクションエンジンではないため、テーブルエンジンをInnoDBに変更します。
2 - トランザクションクエリ("START TRANSACTION;" OR "ROLLBACK;")の接続は、他のクエリ(挿入または更新)と同じである必要があります。
ZF2でこれを行うには、現在のdbアダプタを取得し、すべてのクエリで使用する必要があります。

このコードが正しくを動作しません:$this->getAdapter()->getDriver()->getConnection()以来

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $this->getAdapter()->getDriver()->getConnection()->rollback(); 

は、新しいDB接続を作成します。代わりに

次のコードを使用:あなたの接続が正しいかどうかチェックするために

$connection = $this->getAdapter()->getDriver()->getConnection(); 
    $connection->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $connection->rollback(); 

は、ちょうどMySQLでクエリログを有効にします。
クエリを実行すると、mysqlログの各クエリの前に接続番号が表示されます。すべてのトランザクションクエリで同じでなければなりません。

関連する問題