バージョン選択

フォーラム

メニュー

オンライン状況

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

PR

先着1,000社 プラグインダウンロード&お申込で1,000円分Amazonギフト券プレゼント amazon pay
広告掲載について

サイト内検索

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


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

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


 



ログイン


EC-CUBEペイメント

統計情報

総メンバー数は27,331名です
総投稿数は86,429件です

投稿数ランキング

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


ネットショップの壺

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

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