バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

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


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

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


 



ログイン


EC-CUBEペイメント

統計情報

総メンバー数は31,976名です
総投稿数は87,520件です

投稿数ランキング

1
seasoft
7331
2
AMUAMU
2712
3
nanasess
1773
4
yuh
1512
5
468
1224
6
red
1177
7
umebius
1007
8
fukap
907
9
shutta
827
10
tsuji
815
11 ramrun 789
12 karin 656
13
tao_s
651
14 sumida 641
15
homan
633
16 DELIGHT 571
17
h_tanaka
566
18
patapata
502
19
flealog
483
20 tonton 436


ネットショップの壺

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

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