質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

2回答

5077閲覧

mysql Dirty Read(ダーティリード)とPhantom Read(ファントムリード)について

Kimsehwa

総合スコア312

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

1クリップ

投稿2015/12/04 07:25

mysqlのisolation_levelによってダーティリードとかファントムリードが起きる可能性があるそうですが、

マスターとスレーブに分けてる場合
マスターでは「ダーティリード」と「ファントムリード」を気にする必要がありますか?

僕が理解してる

ダーティリードとは

データキャッシュに反映されてコミットされてないデータが見えてしまうこと

ファントムリードとは

トランザクション中、追加・削除された行を読むこと

です。

ユーザーはマスターとデータを同期してるスレーブのほうに読み込みをするので
そんなに気にしなくていいのでは?と思いました。

皆さんはどう思われますでしょうか。

KiyoshiMotoki👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

手元の環境で検証したところ、以下の結果になりました。

  • ダーティリード => 発生しない
  • ファントムリード => 発生しない
  • ファジーリード => 発生する

■検証環境

  • MySQL : バージョン5.5
  • レプリケーション形式 : ステートメントベース

https://dev.mysql.com/doc/refman/5.6/ja/replication-formats.html

  • トランザクション分離レベル : READ UNCOMMITTED

■検証方法

sql

1master> select @@tx_isolation; 2+------------------+ 3| @@tx_isolation | 4+------------------+ 5| READ-UNCOMMITTED | 6+------------------+ 71 row in set (0.00 sec) 8 9slave> select @@tx_isolation; 10+-----------------+ 11| @@tx_isolation | 12+-----------------+ 13| REPEATABLE-READ | 14+-----------------+ 151 row in set (0.00 sec) 16 17master> SELECT * FROM test; 18+----+ 19| id | 20+----+ 21| 1 | 22+----+ 231 row in set (0.00 sec) 24 25slave> SELECT * FROM test; 26+----+ 27| id | 28+----+ 29| 1 | 30+----+ 311 row in set (0.00 sec) 32 33 34# ダーティリード 35 36master> START TRANSACTION; 37Query OK, 0 rows affected (0.00 sec) 38 39master> UPDATE test SET id = 2; 40Query OK, 1 row affected (0.00 sec) 41Rows matched: 1 Changed: 1 Warnings: 0 42 43slave> SELECT * FROM test; # この時点で変更が見えていないため、ダーティリードは発生していない。 44+----+ 45| id | 46+----+ 47| 1 | 48+----+ 491 row in set (0.00 sec) 50 51master> COMMIT; 52Query OK, 0 rows affected (0.01 sec) 53 54slave> SELECT * FROM test; 55+----+ 56| id | 57+----+ 58| 2 | 59+----+ 601 row in set (0.00 sec) 61 62 63# ファジーリード 64 65slave> START TRANSACTION; 66Query OK, 0 rows affected (0.00 sec) 67 68master> UPDATE test SET id = 1; 69Query OK, 1 row affected (0.00 sec) 70Rows matched: 1 Changed: 1 Warnings: 0 71 72slave> SELECT * FROM test; # この時点で変更が見えてしまうため、ファジーリードが発生している。 73+----+ 74| id | 75+----+ 76| 1 | 77+----+ 781 row in set (0.00 sec) 79 80slave> ROLLBACK; 81Query OK, 0 rows affected (0.00 sec) 82 83# ファントムリード 84 85master> START TRANSACTION; 86Query OK, 0 rows affected (0.00 sec) 87 88master> DELETE FROM test; 89Query OK, 1 row affected (0.00 sec) 90 91slave> SELECT * FROM test; # この時点で元のデータが見えているので、ファントムリードは発生していない。 92+----+ 93| id | 94+----+ 95| 1 | 96+----+ 971 row in set (0.00 sec) 98 99master> COMMIT; 100Query OK, 0 rows affected (0.00 sec) 101 102slave> SELECT * FROM test; 103Empty set (0.00 sec)

ダーティリード・ファントムリードが発生しない理由は、リファレンスの以下の記述からも確認できます。
https://dev.mysql.com/doc/refman/5.6/ja/binary-log.html

バイナリロギングは、ステートメントまたはトランザクションの完了後すぐに行われますが、すべてのロックがリリースされるかコミットが実行されるよりも前になります。これにより、ログがコミット順に記録されることが保証されます。

つまり、マスター側のトランザクション内で実行されたデータ変更は、それがコミットされるまでバイナリログに書き込まれないため、スレーブ側から見える事はない、という事です。

恐らく、この動作はトランザクション分離レベルによらないものと思われます。

投稿2015/12/05 09:19

編集2015/12/05 09:28
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

トランザクション分離レベルについては、MySQLを使ってトランザクション分離レベルの違いを試す
MySQLのトランザクション分離レベル 辺りを参考にされては?

MySQLはトランザクション分離レベルなど細かなところには目をつむってパフォーマンスに重点を置いているいさぎよいDBだと思っています。いさぎよさに目をつむれない案件では他のDBを使います。

投稿2015/12/04 22:50

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問