No.1ベストアンサー
- 回答日時:
上記にあるように、START TRANSACTION、COMMIT、および ROLLBACK を使います。
No.8
- 回答日時:
> 一連の操作を見て、
矛盾が見つかればやり直し
つまり、矛盾がおきる条件が確定しているから
INSERTする前にチェックするだけですべて解決です
いま例示されてあいまいなものではなく
具体的なテーブルとデータのサンプルが
あればどうしたらいいか回答のしようもありますが
yambejp さん、再度の回答ありがとうございます
>INSERTする前にチェックするだけですべて解決です
チェックするためには、
メビウスの帯のように一連の操作、一つ一つを見ても発見は不可能なので、
ユーザ操作後のデータベースを一旦作成して
それが整合性の取れたデータベースになっているかをチェック
するので、結局同じことですね。
何度もありがとうございます。
No.7
- 回答日時:
#6
いや、理解がおかしいです
論理的におかしなデータは投入してからもとに戻すのではなく
データ投入しないのです。
入れてから削除ではなく、入れていいか検索して
問題なければ投入、そうでなければ「なにもしない」という
処理が正しいです
なのでそこにはロールバックは発生しません
yambejp さん、再度の回答ありがとうございます
>いや、理解がおかしいです
>入れてから削除ではなく、入れていいか検索して
>問題なければ投入、そうでなければ「なにもしない」という
>処理が正しいです
そうなんですが、いつどこで判断したらよいのかで悩みました
操作毎にチェックするのでは、
操作1 AはBよりも大きい
操作2 BはCよりも大きい
操作3 CはAよりも大きいという情報を否定する操作
とすると操作2のときに矛盾が判明しますが、その時点では既に操作1は完了しています。また操作3まで実行すれば矛盾が解消されますが、操作3の実行を予測することは不可能です。
利用者が入力完了と言った時点で、一連の操作を見て、
矛盾が見つかればやり直し
すれば良いと思ったのですが、まずいのでしょうかね。
もっと賢い解決策がお有りなら、ご教示お願いします!
No.6
- 回答日時:
#5
>SQLに渡してみないと、変なデータかどうかは判断できない場合
データベースの構造や型を把握しないで送ることはありえません。
なので理論的にそういう場合はありません。
むしろSQL側の制限で、たとえばnot nullにnullを入れたり、
ユニークカラムにダブりを入れたりする場合は、
バリデートは通解して、入力自体が拒否されるのでロールバックさえ
不要です。
特殊な条件付けをする場合は、トランザクションで、条件を検索して
からデータ投入することになるでしょう。その場合もロールバックでは
ないです。
yambejp さん、再度の回答ありがとうございます
>データベースの構造や型を把握しないで送ることはありえません。
>なので理論的にそういう場合はありません。
想定されているエラーのレベルが違う気がします。
データベースの構造や型に合致していて局所的には整合性が取れたデータであり、別の状況では正しいデータであるが、現存するデータに追加すると初めて矛盾するような一連のデータというのは、ありえると思いますが。
非常に単純化した例では、
データベースに
AはBよりも大きい
BはCよりも大きい
という2つのデータを追加する場合。
もし、データベースに
CはAよりも大きい
というデータが(間接的であっても)存在すれば、これらの操作はエラーとして処理を無効化するということです。
もしも、その先にこの矛盾を否定するような(CはAよりも大きいを導くデータの一部を削除する)操作をユーザが行う場合には、エラー処理とならずに正常終了とし、これらの操作は有効とします。
No.5
- 回答日時:
> ユーザが変なデータを食べさせた
変なデータというくらいですから、想定がすでにありますよね?
であればSQLにわたす前にバリデート処理で所定のルールを
通過しない場合処理を行わないというのが普通です
yambejp さん、お久しぶりです。回答ありがとうございます
>SQLにわたす前にバリデート処理で所定のルールを
>通過しない場合処理を行わないというのが普通です
確かに、事前に変なデータなのかが判断出来る場合はそうなんですが、
SQLに渡してみないと、変なデータかどうかは判断できない場合もある気がしています。うまい例が見つからないのですが、気持ちとしては
局所的に見れば整合性の取れた一連のデータであっても、
現存するデータに追加すると矛盾するような一連のデータの挿入操作
でしょうか。
無かったことにしたいのは、矛盾が発見された直前の操作ではなく、そこに至るまでの一連の操作です。
No.4
- 回答日時:
No.2です。
> まさにこれです。
具体的状況・・・というかプログラムの内容がわかりませんが、何かしらプログラム内で(プログラムの作成者にとって)予期せぬエラーが有った際にデータベースのテーブルが壊れてバックアップを落として修復せねばならないという状況になるということであれば、それは「トランザクションの単位や作りが悪い!」つまり「プログラムの設計誤り」ということになるかと思います。
参考まで。
貴重な意見、ありがとうございます。
>具体的状況・・・というかプログラムの内容がわかりませんが、
ユーザが変なデータを食べさせた場合でも、被害が及ばないようにする、
ユーザが途中で作業を中止したい場合に、それまでの操作をなかったことにする
ためです。
No.3
- 回答日時:
>操作対象のテーブルを保存
CREATE TEMPORARY TABLE new_tbl AS SELECT * FROM orig_tbl;
――とか。
https://dev.mysql.com/doc/refman/8.0/en/create-t …
https://dev.mysql.com/doc/refman/8.0/en/create-t …
ただ、一般的なundo実装なら、テーブル丸コピーは牛刀割鶏かも。
回答ありがとうございます
>ただ、一般的なundo実装なら、テーブル丸コピーは牛刀割鶏かも。
START TRANSACTION、COMMIT、および ROLLBACK を使うのが正解ということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- MySQL mysqlがインストールされているのかわかりません 1 2023/06/05 02:26
- 電子レンジ・オーブン・トースター 電子レンジの非科学的(カルト的)動作の原因について考えられる理由を知りたい 8 2022/11/29 14:47
- Excel(エクセル) エクセルのバージョン2016フリーズ改善策 5 2022/12/13 09:13
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- ライブ・コンサート・クラブ 照明や音響スタッフについて 4 2022/12/24 18:31
- MySQL #1062 - '0' は索引 'PRIMARY' で重複しています。とでています。 1 2023/01/01 06:13
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- Excel(エクセル) マクロの付いたExcelが開けません 3 2023/02/01 10:54
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【初心者】XAMPPのapacheの(恐...
-
プログラミング言語で、使える...
-
PHP8を使うと、大量のWarningが...
-
ワードプレスサイト PHP8.0.25...
-
ファイルの書き込みについて教...
-
if(preg_match("/[^0-9]/",$gu_...
-
アマゾンのような評価の星を選...
-
phpでcookieがうまく保存されない
-
ファイルアップロードの上限を...
-
PHPで訪問回数を表示するカウン...
-
PHPSpreadsheetを使って関数を...
-
記述のおかしいところを教えて...
-
php テーブルが作成できない
-
PHPのエラーの解消法について教...
-
【スプレッドシート】順位のつけ方
-
PHP MySQLに画像を直接保存
-
Q&Aサイトを作成していてURLの...
-
アップロードファイルの数に応...
-
PHPのセッション有効期限について
-
php 確認表示画面で値をSESSION...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpでcookieがうまく保存されない
-
index.phpに入るには、どうすれ...
-
PHP8を使うと、大量のWarningが...
-
PHPSpreadsheetを使って関数を...
-
重複を防ぐ記述について教えて...
-
index.phpって何ですか? 具体...
-
awsにApacheとPHPを入れて、何...
-
phpでPEAR::DBを使っているので...
-
php 確認表示画面で値をSESSION...
-
PHPでユーザー情報を入力して簡...
-
ワードプレスサイト PHP8.0.25...
-
php 完了画面の送信メールのコ...
-
SFTPなどは使わないホームペー...
-
PHPのセッション有効期限について
-
csvファイルについて教えて下さ...
-
PHPとHTML+Xamppの掲示板で画像...
-
PHPで訪問回数を表示するカウン...
-
ファイルアップロードに関して...
-
掲示板を作成しておりアップロ...
-
Q&Aサイトを作成していてURLの...
おすすめ情報