26

このOracle Javaチュートリアルから:

反復不可能な読み取りは、トランザクション A が行を取得し、その後トランザクション B が行を更新し、その後トランザクション A が同じ行を再度取得するときに発生します。トランザクション A は同じ行を 2 回取得しますが、異なるデータが表示されます。

ダーティ リードと非反復可能リードの違いは何ですか? それは同じことではありませんか?他の人が更新したために間違った結果を読んでいますか?

前もって感謝します。

4

4 に答える 4

24

まったく同じページで、ダーティ リードとは何かが説明されています。

コミットされていない更新された値へのアクセスは、その値が以前の値にロールバックされる可能性があるため、ダーティ リードと見なされます。後でロールバックされる値を読み取った場合、無効な値を読み取ったことになります。

したがって、繰り返し不可能な読み取りは、コミットされた 2 つの異なる値を読み取ることで構成されますが、ダーティ リードは、まだコミットされていない値を読み取ることで構成されます。かなり違います。

于 2013-08-18T09:28:31.977 に答える
16

ここから:-

ダーティ リードは、あるトランザクションが別のコミットされていないトランザクションによって書き込まれたデータを読み取るときに発生します。ダーティ リードの危険性は、他のトランザクションがコミットされず、元のトランザクションに「ダーティ」データが残る可能性があることです。

Non Repeatable Readsは、1 つのトランザクションが同じデータに 2 回アクセスしようとし、2 番目のトランザクションが最初のトランザクションの読み取り試行の間にデータを変更した場合に発生します。これにより、最初のトランザクションが同じデータに対して 2 つの異なる値を読み取る可能性があり、元の読み取りが反復不能になる可能性があります。

于 2013-08-18T09:29:08.903 に答える
1

私はあなたが以前と同じように混乱していました。

あなたの投稿の回答を読んだ後、mysql doc から調べることにしました。

mysqlからドキュメントを読んだ後、私たちを混乱させているのは理解の角度だと思います。「トランザクション A はコミットなしで 1 つのレコードを変更し、トランザクション B は前後に 2 つの異なるデータを読み取ります。これは実際には「ダーティ データ」と「反復不可能な読み取り」です」と考えています。 2 つのトランザクションの動作の結果。

しかし、正しい角度は次のとおりです。「ダーティ読み取り」は2トランザクションのことですが、「反復不可能な読み取り」は完全に1トランザクションのことです。

それはどういう意味ですか?たとえば、あなたがトランザクションで、私があなたの後のトランザクションである場合。あなたは X を読み、私はそれを Y に更新し、それからもう一度読みます。

米国へ、あなたはダーティ データを読みました。私がコミットしていないためです。ロールバックしたいのかもしれません。私はあなたにdityデータを読ませます。

あなた自身にとって、あなた自身のトランザクションでは、2 つの異なるデータを読み取ります。これは反復不可能なデータです。

少し冗長です。役に立ちますように。

参照: 1. https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_dirty_read
2. https://dev.mysql.com/doc/refman/8.0/en/glossary.html #glos_non_repeatable_read

于 2020-04-13T06:57:06.413 に答える