ちなみに、以下のような更新方法(長いのでコメントに記載)を考えており、この方法の問題点や他のやり方がある場合も是非。
よろしくお願いします。
問題点ですが、
AテーブルのIDの取得をどうするのか?
同一タイトル名があった場合
同時に 複数の人が Aテーブルに更新を入れた場合(①の処理)
→Bテーブルの a_idに 同じIDが入る場合があるのでは?
あと flagが NULLのものは どうするのか?
などが 考えられます。
トランザクションを使わずに整合性を保つ方法は本来ありません。
どうしてもやりたいのなら、
更新前のデータをファイル等に保存しておき、
更新失敗したら、データを戻すことです。
ただし、データが必ず戻せるかどうかは不明ですので、ここで不整合になります。
しかしながら、不整合になったと言うデータをファイルに保存しておいて
機会あるごとにデータを修復するとともに
不整合なデータを用いるときに注意をする必要があります。
回答どうも有り難うございます。
トランザクション無しの更新は同時実行制御が煩雑で非現実的
追記限定であれば整合性を保つ事は容易
更新(メンテナンス)を他ユーザー完全シャットアウトで行えばトランザクション無しも可能
追記限定であればコメント欄の方法で対処可能
>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
負荷もタイムラグも大きく
タイトな仕様にはトランザクション導入必須
回答ありがとうございます。参考にさせて頂きます。
回答有り難うございます。ご指摘頂いた点ですが、
> AテーブルのIDの取得をどうするのか?
IDはAUTO_INCREMENTなので、①の時にIDは自動採番されますので、それを取得します。
> 同一タイトル名があった場合
> 同時に 複数の人が Aテーブルに更新を入れた場合(①の処理)
titleとflagに、ユニークインデックスを貼ってますが、
NULL値を持つカラムがあると、重複してても更新可能なので、①の時には問題ありません。
③のflag = 1になった時に、どちらかがエラーになると思います。
> Bテーブルの a_idに 同じIDが入る場合があるのでは?
上記の通り、AテーブルのIDは自動採番されますので、IDの重複はないと思います。
> あと flagが NULLのものは どうするのか?
不要になるので、あとでまとめて削除する、でしょうか。
以上、妄想したたけで、ちゃんと調べてないので、
もし間違っている or とぼけたことを言ってましたらお叱りください。