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

ストアドプロシージャでトランザクション処理をするにはどうすれば良いのでしょうか?

複数のテーブルの行をストアドプロシージャで一括削除したいのですが、
エラーが発生した場合は、ロールバックしたいと思っています。

たとえば、
create table A (id INT, name VARCHAR(32)); // idと名前を持つテーブルA
create table B (id INT, address TINYTEXT); // idと住所を持つテーブルB
の二つのテーブル(idで紐付け)で、

Aの行が削除されたらBの行を削除するが、Bの削除でエラーが出た場合はAの削除をロールバックする。

という処理を行いたいのです。(ロールバックが可能であれば、ストアドプロシージャでなくても構いません。)

どのように書けば良いのでしょうか?
よろしくお願いします。

A 回答 (1件)

私も気になって調べてみました。


単純な語句で検索するだけではなかなかヒットしませんね。。
こういう場所で知識を共有していきたいところです。

実際に実行して試したわけではないので、動作の保障はしかねますが、
下記のような記述でロールバックを実現できるとの記載を見つけました。

CREATE PROCEDURE proc(....., ...)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
     ROLLBACK;
    END;
    START TRANSACTION;
     :
     :
     :
    COMMIT;
END;

http://ameblo.jp/hotbrain/entry-10477377702.html
http://dev.mysql.com/doc/refman/5.1/ja/declare-h …

DECLARE ... BEGIN ... END が catch,
START TRANSACTION ... COMMIT が try
みたいなイメージでしょうか、よくわかりませんが。

DECLAREの後とFORの後のキーワードには幾つか選択肢があるようなので、
ご自信の実現したい処理に応じて使い分けてみてください。

それから、机上の空論をひとつ。
上記のような記述をした場合でも、ストレージエンジンの差異による
トランザクション処理実行の可否はあると思っています。

トランザクション処理が可能なのはinnoDBのみ、MyISAMでは不可能です。
http://d.hatena.ne.jp/akio0911/20080327/1206586425

> 質問者様
既知でしたらすみません。

> 質問者様、閲覧者様
ここまでの内容に誤りがありましたら、ご指摘ください。

よろしくお願いします。
    • good
    • 0

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

関連するカテゴリからQ&Aを探す