アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。

タイトルの通りなのですが
PHPではpostgreを使用してのトランザクション処理で
処理が失敗した時に
ロールバック処理を意識しなくていいのでしょうか?

$conn=pg_connect("host=dbhost user=dbuser password=password dbname=dbname port=5432");
$query="BEGIN;";
$result=pg_exec($conn,$query);
$query="INSRET INTO ....;";
$result=pg_exec($conn,$query);
$query="COMMIT;";
$result=pg_exec($conn,$query);
pg_close($conn);

このコミット時に自動でロールバックされる?

どなたかご存知の方、よろしくお願いします。

A 回答 (3件)

PHPよりも、postgreの板で聞いたほうがよいかもしれません



PHPはROLLBACKに関してはまったく関係ないです

トランザクションとは、小さな処理をひとまとめに考えて、どれか1つの処理でも正常に処理されなかった場合に全ての処理を無かったことにする
という概念です

例えば、現金自動引き落とし機の場合
「現金を支払う」
という処理のほかに
「残高を支払った分だけ引く」
という処理が同時に成功しなくてはなりません


BEGIN でトランザクションを始めて、
COMMITで終わるわけですから、
BEGINの後に、処理をし、その後にデータチェックさせて正常ならばCOMMITさせて、異常ならばROLLBACKさせる
という処理でなくては意味ないです

トランザクション開始(BEGIN)
データの保存(UPDATEなど)
データを読み込んで(SELECT)
データのチェックをして
異常ならばROLLBACK
正常ならばCOMMIT

という流れになります



INSERTの失敗は、データには何も書き込まれませんからROLLBACKする必要の無い質問例文になっていますね
    • good
    • 0

普通は何らかの処理が失敗した場合にはロールバックしますが、


インサートが失敗したときは、変更が無かったということなので、
ロールバックする必要もないということでしょうね。

>コミット時に自動でロールバックされる?
とても勘違いがあると思います。
コミットは、ロールバックしたときの戻れる時点を作ると考えるといいと思います。

トランザクションは
関連する処理をひとまとめに考えて
例えばあるトランザクションとしてA,B,Cという3つの処理が必要な時に
Aという処理は終わったが、何らかの理由でBができなかったり、Cができなかったときに、Aという処理自体も無効(なかったことにする)にするために、ロールバックをします。
Cまでの処理が終わった時点で、次のロールバックがかかったときに、今成功した処理が無効になってしまわないために、成功した一区切りの処理が終わったらコミットします。
もし次ロールバックが起こったらこのコミットした時点に戻ることになります。
    • good
    • 0

例題に多少の疑問はあるが、


各クエリの成否によりcommitするか決めるのが普通

> このコミット時に自動でロールバックされる?
意味がわかりにくいが、失敗時にロールバッグされるかという意味?
まずは、最後のcommitを省くとどうなるか試してみる
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!