質問 > その他 > プラグインで、rollback の後に commit がある処理の実装について |
その他
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
nyarnyar |
投稿日時: 2017/10/5 20:49
対応状況: −−−
|
新米 登録日: 2017/10/5 居住地: 投稿: 1 |
プラグインで、rollback の後に commit がある処理の実装について お世話になっております。
EC-CUBE3.0.14 を用いて、 以下の処理を行うようなプラグインを製造しているところです。 // 処理A: データ登録処理 // 処理成功フラグ $isSuccess = true; try { // 複数のレコードを DB に登録 $em->getConnection()->beginTransaction(); // ... 何らかの処理 .... // 正常に登録できたので、コミット $em->getConnection()->commit(); } catch (Exception $ex) { // 登録時に、何らかのエラーが出たので、ロールバック $em->getConnection()->rollBack(); $isSuccess = false; } // 処理B: 結果テーブルに、処理結果を追加 if ($isSuccess) { // 処理が成功したとことを結果テーブルに保存 } else { // 処理が失敗したとことを結果テーブルに保存 } 仕様としては、 処理A 全データが登録できたらコミット。 そうでなければ、登録が成功したもの含めてロールバック 処理B 処理A が成功・失敗に関係なく、結果テーブルに処理結果を 保存する。 となります。 で、実際に処理を書いてみると、 処理Aが成功する場合は、処理Bもコミットされるのですが、 処理A が失敗した場合、処理Bでコミットが行われるとき、 明示的に、commit() を呼ぶと、 Transaction commit failed because the transaction has been marked for rollback only. というエラーになりますし、 commit() を記載しないと、結果テーブルには、結果が保存されません。 (処理A のロールバックが、処理Bにも適用されている) どうソースを記述しましたら、 期待した動きにすることができるのでしょうか。 |
468 |
投稿日時: 2017/10/6 10:29
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: プラグインで、rollback の後に commit がある処理の実装について 実際に動かしたわけではないので、ダメかもしれませんが、
AとBの間でもう一度、 $em->getConnection()->beginTransaction(); を記述すればいいのではないでしょうか?
|
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |