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かもしれないし、他の順番かもしれません。
考えられる順番で、最後の残高がどうなるか考えてみてください。
なんのロック処理もしなくても、データベースファイルが壊れることはありません。でも、正しいロック処理をしなければ、多分、この銀行は壊れます(笑)
回答ありがとうございます
単一テーブルです。ロック処理は必要ないんですね
気軽なサイトなのでロックしないで使うことにしました。ありがとうございました(_ _
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 …
回答ありがとうございます
mysqlのバージョンは5.1.22でした
例えば
mysql_query('LOCK TABLES mes WRITE');
など使わなくても、MyISAMでも自動で排他ロックをかけてくれるのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- JavaScript Typescript が必要な理由 1 2023/01/07 11:45
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- ドライブ・ストレージ SSDの書き込み可能量「TBW」書き込みの多い作業は何ですか? 5 2022/05/28 04:51
- その他(SNS・コミュニケーションサービス) 書き込んだ場合、同サイトの同ページに出てこない? 1 2022/05/24 02:44
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- ドライブ・ストレージ 【緊急】USBメモリから変な音がする 6 2022/05/20 15:52
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SELECT文でのデッドロックに対...
-
SQLServer Insertが遅い
-
SELECT時の行ロックの必要性に...
-
Oracleの排他制御について教え...
-
accessのロック
-
INSERTにおいてロック処理は必要か
-
DB2のロック調査
-
同一トランザクションの中でテ...
-
トランザクション中にSELECTし...
-
UPDATE文で発生するデッドロッ...
-
ExcelからAccess2013DBを更新す...
-
DB2の更新ロックについて
-
SELECT FOR UPDATE にトランザ...
-
Oracleで構築されているDBをMyS...
-
更新ロックとデッドロック
-
MongoDBのデータ更新はDBを排他...
-
トランザクションの考え方
-
DB2でSelectした時(rollback,c...
-
排他ロックしたレコードが、別...
-
エクセルでCtrl+Tでテーブルの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLがPostgreSQLより優れてい...
-
SELECT時の行ロックの必要性に...
-
accessのロック
-
SELECT文でのデッドロックに対...
-
Oracleの排他制御について教え...
-
INSERTにおいてロック処理は必要か
-
SQLServer Insertが遅い
-
UPDATE文で発生するデッドロッ...
-
AccessShareLock はどの程度気...
-
同時書き込み
-
同一トランザクションの中でテ...
-
SELECT FOR UPDATE にトランザ...
-
更新ロックとデッドロック
-
ExcelからAccess2013DBを更新す...
-
排他ロックしたレコードが、別...
-
トランザクション中にSELECTし...
-
DB2のロック調査
-
DB2でSelectした時(rollback,c...
-
SQLServerの明示的なロックの仕...
-
SELECT文でタイムアウト...
おすすめ情報