mysqlのisolation_levelによってダーティリードとかファントムリードが起きる可能性があるそうですが、
マスターとスレーブに分けてる場合
マスターでは「ダーティリード」と「ファントムリード」を気にする必要がありますか?
僕が理解してる
ダーティリードとは
データキャッシュに反映されてコミットされてないデータが見えてしまうこと
ファントムリードとは
トランザクション中、追加・削除された行を読むこと
です。
ユーザーはマスターとデータを同期してるスレーブのほうに読み込みをするので
そんなに気にしなくていいのでは?と思いました。
皆さんはどう思われますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア4791
0
トランザクション分離レベルについては、MySQLを使ってトランザクション分離レベルの違いを試す、
MySQLのトランザクション分離レベル 辺りを参考にされては?
MySQLはトランザクション分離レベルなど細かなところには目をつむってパフォーマンスに重点を置いているいさぎよいDBだと思っています。いさぎよさに目をつむれない案件では他のDBを使います。
投稿2015/12/04 22:50
総合スコア16415
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。