19

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

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

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

4

4 に答える 4

41

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

$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')
于 2012-12-13T15:10:45.410 に答える
24

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

何が起こったのかを知るために、Zend \ Db\AdapterのAPIドキュメントに飛び込む必要がありました。

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

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

Eww。

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

BEGIN TRANSACTION自分で/// ROLLBACKSQLCOMMITステートメントを発行できることを忘れないでSET autocommit=...ください。Zend \ Dbがトランザクションの状態を追跡しているようには見えないため、これはおそらく問題ありません。

于 2012-12-12T02:44:29.293 に答える
8

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

このコードは正しく 機能しません:

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

$this->getAdapter()->getDriver()->getConnection()新しいデータベース接続を作成し てから。

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

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

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

于 2014-03-09T10:25:32.460 に答える
0

beginTransaction、、コントローラーで使用 rollbackしました。commit

さまざまなモデルで多数のトランザクションを実行し、制御トランザクションなしで事前定義された関数を使用しました(単一の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();

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

于 2019-12-12T07:14:08.580 に答える