mysql:13831
From: "T.Hirotsu" <"T.Hirotsu" <hirotsu@xxxxxxxxxx>>
Date: Mon, 26 Mar 2007 22:01:49 +0900
Subject: [mysql 13831] Re: テーブルのロックについて
まず最初に、テキストファイルの読み書きなどと違って、データベースサーバーに SQL 文を投げる場合、ロックをしないことによって、テーブルが壊れることはありません。 データベースでロックとアンロック(またはトランザクション・・・以下同様)を用いる主目的 は、テーブルやファイルを壊さないことではなく、一連の SQL 文を連続して実行することを 保証することです。 (トランザクションの場合は、これに加えて、一連の SQL 文の途中で、や〜めた、ができます) 従いまして、ストレージエンジンやトランザクションの分離レベルに関係なく、SQL 文1つで 処理がすむ場合はもちろん、複数の SQL 文で処理を行う場合でも、それらの SQL 文の間に、 他の PC などから投げられる可能性があるどのような SQL 文が実行されても結果が変わら ない場合には、わざわざ、ロックを用いる必要はありません。 一方、複数の SQL 文を必ず連続して実行しないと結果が変わる場合([mysql 13817]で、 「ロックが必要なのは、同時に処理すべき SQL 文が複数の場合です」と書きましたが、 「同時に」は正確ではないですね。 正しくは、「連続して」です)に、ロックを用いる必要が あります。 >IDは各PCで重複しないように生成するので単独のINSERT文ではエラーにならないとします。 >INSERTしようとしたレコードはロックしなくても全て正しく書き込まれるか >ロックせずに同時に書き込もうとしてテーブルが壊れてしまうような事はないのか 複数の PC から同時に実行されたとき、各 INSERT 文の実行順序に意味がありますか? ID が必ず unique なのであれば、どれから実行しても結果は同じではないでしょうか。 だとしたら、ロックを用いなくても全て正しく書き込まれます。 また、前述しましたように、テーブルが壊れてしまうような事はありません。 >SELECT * FROM A WHERE ID=aaa; (or ID=bbb;) >のようにして呼び出して画面に表示した後更新する >UPDATE A SET コメント=yyyyy,登録日=yyyy/mm/dd hh:mm:ss WHERE ID=aaa; (or ID=bbb;) SELECT 文と UPDATE 文の間に、他の PC などから投げられた SQL 文が実行されると 結果が変わりますか? UPDATE 文のコメントと登録日の値を決めるのに、SELECT 文で取得した値を用いているので あれば、結果が変わる可能性がありますので、ロックが必要です。 しかし、UPDATE 文のコメントと登録日の値が、SELECT 文で取得した値と無関係であれば、 結果は同じですので、ロックの必要はありません。 また、SELECT 文と UPDATE 文の間に、DELETE FROM A WHERE ID = aaaa; という SQL 文が 他の PC から投げられる可能性があるとき(そして、その場合)、ロックを用いなければ UPDATE 文の影響レコード数は 0 になります。 ただし、ロックを用いても、UPDATE した後に DELETE されますので、【結果】は一緒です。 違いは、UPDATE 文の影響レコード数が、0 か、非 0 かだけです。 また、例示されたケースの場合、ロックが必要だからといって、画面表示からユーザーの 入力を挟んでロックしますと、ユーザー入力が終わらない限り、ロックしたテーブルまたは レコードへの、他 PCからの SQL 文がブロック(実行待機)され続けますので、ご注意を。 ついでに、トランザクションを用いる場合には、YuGo さんも触れられていますが、 トランザクション分離レベルについての理解が不可欠です。 特に、MySQL では、デフォルトで自動コミットモードがオンになっていますので、 理解しないまま、InnoDB を使うと悲惨な目にあいます。(笑)
13814 2007-03-22 20:32 [<ml_mysql@xxxxxxxxxx] Mysql の出力を、UTF8に変換できない 13815 2007-03-22 21:24 ┗["TOYOSHIMA,Masayuki"] 13816 2007-03-23 15:55 ┗[Tecchi <mugen_ml@xxx] テーブルのロックについて 13817 2007-03-23 21:30 ┣["T.Hirotsu" <hirotsu] 13818 2007-03-24 02:51 ┃┗[Tecchi <mugen_ml@xxx] 13824 2007-03-26 08:47 ┗[YuGo <yu.gotou@xxxxx] 13830 2007-03-26 18:12 ┗[Tecchi <mugen_ml@xxx] -> 13831 2007-03-26 22:01 ┣["T.Hirotsu" <hirotsu] 13832 2007-03-27 15:11 ┗[YuGo <yu.gotou@xxxxx] 13833 2007-03-27 19:14 ┗[Tecchi <mugen_ml@xxx]