mysql:13832
From: YuGo <YuGo <yu.gotou@xxxxxxxxxx>>
Date: Tue, 27 Mar 2007 15:11:02 +0900
Subject: [mysql 13832] Re: テーブルのロックについて
> テーブルAを以下のように作ったとします。 > ストレージエンジンはMyISAMとInnoDBのいずれかです。 > トランザクションの分離レベルというのはまだよく分からないのでデフォルトのままです。 > CREATE TABLE A ( > ユーザID integer NOT NULL, > コメント varchar(20), > 登録日 datetime, > PRIMARY KEY (ユーザID) > ) ; > 各PCから > MyISAMの場合は > INSERT A SET ユーザID=aaa,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > INSERT A SET ユーザID=bbb,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > INSERT A SET ユーザID=ccc,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > のように実行してInnoDBの場合は > BEGIN; > INSERT A SET ユーザID=ddd,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > INSERT A SET ユーザID=eee,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > INSERT A SET ユーザID=fff,コメント=xxxx,登録日=yyyy/mm/dd hh:mm:ss; > ・・・ > COMMIT; > のようにまとめて実行したとします。 > IDは各PCで重複しないように生成するので単独のINSERT文ではエラーにならないとします。 > > これが同時に複数PCから実行された場合に > ・INSERTしようとしたレコードはロックしなくても全て正しく書き込まれるか > ・ロックせずに同時に書き込もうとしてテーブルが壊れてしまうような事はないのか > ・MyISAMとInnoDBで違いはあるのか > という事です。 > > UPDATEについても同様で > 例えば2台のPCからIDの違うレコード(ID=aaaとID=bbb)を > 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;) > の文を同時に実行した場合に > > ・ID=aaa,bbbのレコードは正しく更新されるのか > ・テーブルが壊れる事はないのか > という事です。 問題点はおそらく2点。 1.SELECT * FROM A WHERE ID=aaa;のとき、誰かが同じデータ(行)を更新してい ると今取得したデータは更新前か更新後かわからない。 2.SELECT ...とUPDATE UPDATE A SET コメント=yyyyy,登録日=yyyy/mm/dd hh:mm:ss WHERE ID=aaaのすき間に誰かがその行を更新してしまう。すると、 SELECTで見たデータではなく更新後のデータを上書きしてしまう。 MyISAM(トランザクションなし)のとき。 1.更新のWRITE ROCKが優先されるので、問題なさそう。 2.SELECTの前に、LOCK TABLE した方がよさそう。 参考にしたURL http://www.buena-idea.net/~hironobu/mysql/m-2-10.html InnoDBのとき。 START TRANSACTION ; SELECT * FROM A WHERE ID=aaa FOR UPDATE ; UPDATE A SET コメント=yyyyy,登録日=yyyy/mm/dd hh:mm:ss WHERE ID=aaa; COMMIT ; としておけば手堅のではないか。 参考にしたURL http://dev.mysql.com/doc/refman/4.1/ja/innodb-locking-reads.html
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]