
No.2ベストアンサー
- 回答日時:
単一のテーブルの単一のデータは、どんなパターンでinsert・updateなどをしても「壊れる」ことはありません。
このための保護は、全て、MySQLが自動でやってくれます。ただし、システムとしてデータが壊れないのと、論理的な意味でデータが壊れないのは話が別です。
よく、例に挙げられるのが、銀行口座の残高。
Aさんの口座から、千円引き出すとします。
a1.Aさんの口座の残高を確認し
a2.その残高から千円を引いて
a3.Aさんの口座残高を新しい値にupdateします。
さて、ここで、Aさんの口座に、千円振り込むとします。やっぱり、
b1.Aさんの口座の残高を確認し、
b2.その残高に千円を足して、
b3.Aさんの口座残高を新しい値にupdateします。
ここで、この二つの処理が同時に発生したとします。
処理の順番は、その時の運によってどうにでもなります。a1,b1,b2,a2,a3,b3かもしれないし、他の順番かもしれません。
考えられる順番で、最後の残高がどうなるか考えてみてください。
なんのロック処理もしなくても、データベースファイルが壊れることはありません。でも、正しいロック処理をしなければ、多分、この銀行は壊れます(笑)
この回答へのお礼
お礼日時:2013/07/10 17:01
回答ありがとうございます
単一テーブルです。ロック処理は必要ないんですね
気軽なサイトなのでロックしないで使うことにしました。ありがとうございました(_ _
No.3
- 回答日時:
No.2です。
書き忘れ、補足。
もし、調べるのであれば、「トランザクション」とか、「分離レベル」などの単語で検索してみてください。この類の話題が、わんさかと引っかかります。
ちなみに、先の例での正しい処理は、update文一発でやることなんですが・・・話を単純化するためにあえて、処理をselect・計算・updateと分離してあります。あしからず。
No.1
- 回答日時:
通りすがりのMySQLerです。
テーブルは自動的にロックされるので更新が競合してデータが壊れるというような心配はありません。
更新処理にはINSERT、UPDATE、REPLACE、DELETE等がありますが、通常これらの処理をしようとすると(MySQLが自動的に)対象のテーブルに排他ロックをかけます。なので同時にひとつのスレッドしか更新ができません。排他ロックがかかっている間は他のスレッドは更新、参照ともにできなくなってしまいますので、更新処理が長くかかる場合には全体的な性能の足を引っ張ってしまいます。ただし、MyISAMの場合INSERTだけは少し特殊で、同時挿入という機能があり、条件があえば参照中にも新しい業の挿入ができるようになっていますので、INSERTは参照の性能の足を引っ張る可能性は低くなります。
MyISAMの場合は、テーブルを更新している間にPCの電源を落としたりするとテーブルのデータが壊れますが、そうでなければ大丈夫です。ちなみに、InnoDBなら複数のスレッドが同時に同じテーブルを更新できるし、PCの電源をいきなり落としてもクラッシュリカバリしてくれるので、本気でサービスを運用するとか、データベースについて学習したいならInnoDBのほうがいいと思います。
参考URL:http://dev.mysql.com/doc/refman/5.6/en/concurren …
この回答へのお礼
お礼日時:2013/07/05 23:21
回答ありがとうございます
mysqlのバージョンは5.1.22でした
例えば
mysql_query('LOCK TABLES mes WRITE');
など使わなくても、MyISAMでも自動で排他ロックをかけてくれるのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT時の行ロックの必要性に...
-
排他ロックしたレコードが、別...
-
accessのロック
-
SELECT文でのデッドロックに対...
-
AccessShareLock はどの程度気...
-
DB2でSelectした時(rollback,c...
-
「マスタ」と「テーブル」の違...
-
ACCESSのSQLで、NULLかNULLでな...
-
3つ以上のテーブルをUNIONする...
-
SI Object Browserのテーブルス...
-
ACCESS2007 フォーム 「バリア...
-
ビューで引数を使いたい
-
データの二重表示の原因
-
IDENTITY列
-
accessのエクスポートエラーに...
-
sqlserverで集計結果をUPDATEし...
-
Access VBA [リモートサーバー...
-
主キーの変更
-
既に使用されているので、使用...
-
大きなテーブルに対する問い合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SQLServer Insertが遅い
-
SELECT時の行ロックの必要性に...
-
accessのロック
-
AccessShareLock はどの程度気...
-
Oracleの排他制御について教え...
-
更新ロックとデッドロック
-
INSERTにおいてロック処理は必要か
-
DB2のロック調査
-
排他ロックしたレコードが、別...
-
トランザクションとlast_insert_id
-
SELECT文でタイムアウト...
-
トランザクション中にSELECTし...
-
デッドロックが発生します。
-
ExcelからAccess2013DBを更新す...
-
UPDATE文で発生するデッドロッ...
-
トランザクション処理について
-
DB2でSelectした時(rollback,c...
-
パススルークエリでのロックに...
-
SELECT FOR UPDATE にトランザ...
おすすめ情報