ZF1 Zend_Dbリファレンスマニュアルには、トランザクションの実行に関するセクション全体があります。
ZF2 Zend \ Dbリファレンスマニュアルには、トランザクションに関するドキュメントがありません。
ZF2でトランザクションを実行するにはどうすればよいですか?サンプルコードが役立ちます。
ZF1 Zend_Dbリファレンスマニュアルには、トランザクションの実行に関するセクション全体があります。
ZF2 Zend \ Dbリファレンスマニュアルには、トランザクションに関するドキュメントがありません。
ZF2でトランザクションを実行するにはどうすればよいですか?サンプルコードが役立ちます。
あなたはそれを持っています。トランザクションを開始、コミット、およびロールバックする適切な方法は次のとおりです。
$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')
不足しているドキュメントは興味深いものです。
何が起こったのかを知るために、Zend \ Db\AdapterのAPIドキュメントに飛び込む必要がありました。
beginTransaction
のように見え、 Zend \ Db \ Adapter \ Driver\ConnectionInterfacerollback
でcommit
定義されています。これは、それらがすべての単一のアダプター接続で呼び出し可能なメソッドであることを意味します。残念ながら、接続自体はかなり埋もれています。
私がはっきりしていないこと(現時点では例を提供できません)は、実際にこれらのメソッドを呼び出すオブジェクトを特定することです。最悪の場合、を呼び出したいようです$adapter->getDriver()->getConnection()->beginTransaction()
。
Eww。
私は、より多くの知識を持ち、便利なZF2のコピーを持っている他の誰かがこれを見て、より良いオプションを提供することを望んでいます。
BEGIN TRANSACTION
自分で/// ROLLBACK
SQLCOMMIT
ステートメントを発行できることを忘れないでSET autocommit=...
ください。Zend \ Dbがトランザクションの状態を追跡しているようには見えないため、これはおそらく問題ありません。
取引を行うには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ログの各クエリの前に接続番号が表示されます。これらはすべてのトランザクションクエリで同じである必要があります。
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();
問題を解決するのに役立つことを願っています。