[前][次][番号順一覧][スレッド一覧]

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]