バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

質問 > その他 > プラグインで、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();
を記述すればいいのではないでしょうか?


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

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


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,801名です
総投稿数は109,972件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2313
5
umebius
2085
6
yuh
1819
7
h_tanaka
1644
8
red
1570
9
mcontact
1289
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

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

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.