人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで複数のテーブルを更新する際にトランザクションを使わずに、更新が失敗してもテーブル間の整合性を保てるテクニックがありましたら教えて下さい。

ちなみに、以下のような更新方法(長いのでコメントに記載)を考えており、この方法の問題点や他のやり方がある場合も是非。
よろしくお願いします。

●質問者: xxmasaxx
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL コメント トランザクション 問題点 整合
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●27ポイント

問題点ですが、

AテーブルのIDの取得をどうするのか?

同一タイトル名があった場合

同時に 複数の人が Aテーブルに更新を入れた場合(?の処理)

→Bテーブルの a_idに 同じIDが入る場合があるのでは?

あと flagが NULLのものは どうするのか?

などが 考えられます。

◎質問者からの返答

回答有り難うございます。ご指摘頂いた点ですが、

> AテーブルのIDの取得をどうするのか?

IDはAUTO_INCREMENTなので、?の時にIDは自動採番されますので、それを取得します。

> 同一タイトル名があった場合

> 同時に 複数の人が Aテーブルに更新を入れた場合(?の処理)

titleとflagに、ユニークインデックスを貼ってますが、

NULL値を持つカラムがあると、重複してても更新可能なので、?の時には問題ありません。

?のflag = 1になった時に、どちらかがエラーになると思います。

> Bテーブルの a_idに 同じIDが入る場合があるのでは?

上記の通り、AテーブルのIDは自動採番されますので、IDの重複はないと思います。

> あと flagが NULLのものは どうするのか?

不要になるので、あとでまとめて削除する、でしょうか。

以上、妄想したたけで、ちゃんと調べてないので、

もし間違っている or とぼけたことを言ってましたらお叱りください。


2 ● hanako393
●27ポイント

トランザクションを使わずに整合性を保つ方法は本来ありません。

どうしてもやりたいのなら、

更新前のデータをファイル等に保存しておき、

更新失敗したら、データを戻すことです。

ただし、データが必ず戻せるかどうかは不明ですので、ここで不整合になります。

しかしながら、不整合になったと言うデータをファイルに保存しておいて

機会あるごとにデータを修復するとともに

不整合なデータを用いるときに注意をする必要があります。

◎質問者からの返答

回答どうも有り難うございます。


3 ● koriki-kozou
●26ポイント

トランザクション無しの更新は同時実行制御が煩雑で非現実的

追記限定であれば整合性を保つ事は容易

更新(メンテナンス)を他ユーザー完全シャットアウトで行えばトランザクション無しも可能


追記限定であればコメント欄の方法で対処可能

>Aテーブルのtitleとflagにタイトル名とNULLを入れて保存

>INSERT INTO a_table (title,flag) VALUES('タイトル',NULL);

>BテーブルにAテーブルのIDと書き込み内容を保存

>INSERT INTO b_table (a_id,body) VALUES('aテーブルのID','書き込み内容');

>途中でエラーがなければ、Aテーブルのflagを1に変更して、更新完了

>UPDATE a_table SET flage=1 WHERE id = 保存したbbsテーブルのID;


Nullよりはゼロなどの定数が良いでしょう

flag TINYINT DEFAULT 0, # フラグ※更新中なら0、完了したら1


負荷もタイムラグも大きく

タイトな仕様にはトランザクション導入必須

◎質問者からの返答

回答ありがとうございます。参考にさせて頂きます。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ