
こんにちは。
タイトルの通りなのですが
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);
このコミット時に自動でロールバックされる?
どなたかご存知の方、よろしくお願いします。
No.3ベストアンサー
- 回答日時:
PHPよりも、postgreの板で聞いたほうがよいかもしれません
PHPはROLLBACKに関してはまったく関係ないです
トランザクションとは、小さな処理をひとまとめに考えて、どれか1つの処理でも正常に処理されなかった場合に全ての処理を無かったことにする
という概念です
例えば、現金自動引き落とし機の場合
「現金を支払う」
という処理のほかに
「残高を支払った分だけ引く」
という処理が同時に成功しなくてはなりません
BEGIN でトランザクションを始めて、
COMMITで終わるわけですから、
BEGINの後に、処理をし、その後にデータチェックさせて正常ならばCOMMITさせて、異常ならばROLLBACKさせる
という処理でなくては意味ないです
トランザクション開始(BEGIN)
データの保存(UPDATEなど)
データを読み込んで(SELECT)
データのチェックをして
異常ならばROLLBACK
正常ならばCOMMIT
という流れになります
INSERTの失敗は、データには何も書き込まれませんからROLLBACKする必要の無い質問例文になっていますね
No.2
- 回答日時:
普通は何らかの処理が失敗した場合にはロールバックしますが、
インサートが失敗したときは、変更が無かったということなので、
ロールバックする必要もないということでしょうね。
>コミット時に自動でロールバックされる?
とても勘違いがあると思います。
コミットは、ロールバックしたときの戻れる時点を作ると考えるといいと思います。
トランザクションは
関連する処理をひとまとめに考えて
例えばあるトランザクションとしてA,B,Cという3つの処理が必要な時に
Aという処理は終わったが、何らかの理由でBができなかったり、Cができなかったときに、Aという処理自体も無効(なかったことにする)にするために、ロールバックをします。
Cまでの処理が終わった時点で、次のロールバックがかかったときに、今成功した処理が無効になってしまわないために、成功した一区切りの処理が終わったらコミットします。
もし次ロールバックが起こったらこのコミットした時点に戻ることになります。
No.1
- 回答日時:
例題に多少の疑問はあるが、
各クエリの成否によりcommitするか決めるのが普通
> このコミット時に自動でロールバックされる?
意味がわかりにくいが、失敗時にロールバッグされるかという意味?
まずは、最後のcommitを省くとどうなるか試してみる
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
phpの処理中に画面表示ををする...
-
PHPが処理を途中でやめる。原因...
-
Smartyにて、文字検索
-
条件分岐 if(elseif) switchの...
-
デバッグの仕方・・・
-
大量チェックボックスの実装方...
-
Cronで同じ処理を複数同時に実...
-
タイムアウト処理?となる
-
インスタンス化に伴うメモリ消...
-
会社の課題で共通処理(phpとht...
-
APIで出てきたXMLをPHPで表示さ...
-
PHPで偶数と奇数を判断するには
-
PHPのSmartyについて質問です。...
-
PHPの%演算子は処理の前に計算...
-
CakePHPでのemptyの 0 判定に関...
-
デフォルト、フロントコントロ...
-
iframe内phpから全体の画面を出...
-
ページの一部だけリロード
-
フォームが送信されたかの確認...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
phpの処理中に画面表示ををする...
-
携帯電話用Webページの自動更新...
-
PHPが処理を途中でやめる。原因...
-
PHP内、ボタン押下と同時にリロ...
-
1つのPHPファイルに何度も同じ...
-
変数の範囲によって場合わけし...
-
phpからjavascriptの関数呼び出し
-
PHPのコード内でjavascriptを使...
-
Cronで同じ処理を複数同時に実...
-
VBAからPHPを実行(キック)したい
-
Smartyにて、文字検索
-
c言語 fopen
-
PHPで文字列の検索
-
質問させてください。
-
アドレスに[?****]と入れると、...
-
PHPでCGIの処理結果を使うには?
-
PHPの変わった閉じタグの必要性...
-
ブラウザから非同期プログラム...
-
SJISでPHP5+POSTGRESQL8
おすすめ情報