web-dev-qa-db-ja.com

ZF2のZend \ Dbはトランザクションをどのように制御しますか?

ZF1 Zend_Dbリファレンスマニュアルには、トランザクションの実行に関する セクション全体 があります。

ZF2 Zend\Dbリファレンスマニュアル トランザクションに関するドキュメントがありません。

ZF2でトランザクションを実行するにはどうすればよいですか?サンプルコードが役立ちます。

19
Greg.Forbes

不足しているドキュメントは興味深いものです。

何が起こったのかを知るために、私はZend\Db\Adapterの API docs に飛び込む必要がありました。

beginTransactionrollback、およびcommitZend\Db\Adapter\Driver\ConnectionInterface で定義されているようです。これは、それらがすべての単一のアダプター接続で呼び出し可能なメソッドであることを意味します。残念ながら、接続自体はかなり埋もれています。

私がはっきりしていないこと(そして現時点では例を提供できないこと)は、実際にこれらのメソッドを呼び出すオブジェクトを把握することです。最悪の場合、$adapter->getDriver()->getConnection()->beginTransaction()を呼び出したいようです。

Eww。

より多くの知識と便利なZF2のコピーを持っている他の誰かがこれを見て、より良いオプションを提供することを望んでいます。

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

23
Charles

あなたはそれを持っています。トランザクションを開始、コミット、およびロールバックする適切な方法は次のとおりです。

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

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

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

これを公開するために、次の方法で作成された最後のIDを取得することもできます。

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

PgSQLを使用している場合は、最後に作成されたIDを返すシーケンスを追加する必要があります。

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')
40
Diemuzi

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

このコード動作しません正しく:

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

$this->getAdapter()->getDriver()->getConnection()以降新しいdb接続を作成します。

代わりに次のコードを使用してください。

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

接続が正しいかどうかを確認するには、mysqlでクエリログを有効にするだけです。
クエリを実行すると、mysqlログの各クエリの前に接続番号が表示されます。これらはすべてのトランザクションクエリで同じである必要があります。

8
Mo Rostami

コントローラでbeginTransactionrollbackcommitを使用しました。

制御トランザクションなしで事前定義された関数を使用するさまざまなモデルで多数のトランザクションを実行しました(単一のDBトランザクションには必要ありません)。

$this->getAdapter()->getDriver()->getConnection()->beginTransaction();の使用
undefined getAdapter()メソッドでエラーが発生します。

だから私は次のように実行します、

  //begain tarnsaction
                $db = Zend_Db_Table_Abstract::getDefaultAdapter();

                $db->beginTransaction();

//rollback

                $db->rollback();

//commit db changes

                $db->commit();

問題を解決するのに役立つことを願っています。

0
Satish