バージョン選択

フォーラム

メニュー

オンライン状況

45 人のユーザが現在オンラインです。 (39 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 45
もっと...

PR

デザインテンプレート EC-CUBE3.0版が登場!
広告掲載について

サイト内検索

質問 > その他 > プラグインで、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
居住地:
投稿: 817
Re: プラグインで、rollback の後に commit がある処理の実装について
実際に動かしたわけではないので、ダメかもしれませんが、
AとBの間でもう一度、
$em->getConnection()->beginTransaction();
を記述すればいいのではないでしょうか?


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

クレジットカード情報の非保持化対応

統計情報

総メンバー数は20,821名です
総投稿数は83,829件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1664
4
yuh
1439
5
red
1082
6
fukap
907
7
shutta
827
8
468
817
9 ramrun 789
10
tsuji
784
11
umebius
777
12
tao_s
651
13 karin 641
14 sumida 638
15
homan
633
16 DELIGHT 571
17
patapata
502
18
flealog
483
19 tonton 436
20
ecbg
387


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© LOCKON CO.,LTD. All Rights Reserved.