1

DB の潜在的な並行性の問題を調べていたので、読みに行きました。http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/c0005267.htmを見つけ、コミットされていないデータへのアクセスについて言及しています。

コミットされていないデータへのアクセス。アプリケーション A がデータベースの値を更新し、アプリケーション B がコミットされる前にその値を読み取る場合があります。次に、A の値が後でコミットされずにバックアウトされた場合、B によって実行される計算は、コミットされていない (おそらく無効な) データに基づいています。

何...他のセッション(同じアプリや同じスレッドでも)がまだコミットされていないデータを読み取ることができると思いましたか? コミットされていないトランザクションにデータを書き込んだ接続/セッション (用語がよくわかりません) だけが、コミットされていないデータを読み取ることができると思いました。

他のスレッドは、コミットされていないデータを本当に読み取ることができますか? mysql を使用する予定ですが、sqlite を使用する可能性があります

4

4 に答える 4

4

他のセッションが読み取ることができるものは、データベースの設定方法によって異なります。MySQL では、使用するデータベース エンジンにも依存します。(ANSI SQL 用語で) 探している用語は"isolation level"です。

多くのデータベースは、コミットされていないデータの読み取りがブロックされる分離レベルにデフォルト設定されます。したがって、トランザクション A がテーブル T のレコード 1234 を更新し、A がコミットまたはロールバックする前にトランザクション B がレコード 1234 を選択しようとすると、A がそれらのいずれかを実行するまで B はブロックされます。

MySQL トランザクション、パート II - トランザクション分離レベルを参照してください。

これの重大な欠点の 1 つは、実行時間の長いトランザクション (通常は) に存在するバッチ更新操作が、多くの要求をブロックする可能性があることです。

B がコミットされていないデータを表示するように設定することもできますが、それはしばしば賢明ではありません。

別の方法として、 MVCC (「マルチバージョン同時実行制御」)と呼ばれるスキームを使用することもできます。これは、トランザクションの開始時間に基づいて、さまざまなトランザクションにデータの一貫したビューを提供します。これにより、コミットされていない読み取りの問題 (ロールバックされる可能性のあるデータの読み取り) が回避され、特に長期間のトランザクションのコンテキストで、はるかにスケーラブルになります。

MySQL は MVCC をサポートしています

于 2009-10-13T20:58:21.233 に答える
0

確かにSQL Serverでは可能です。それを選択する必要があります。デフォルトではありませんが、適切な分離レベルまたはクエリヒントを使用すると、コミットされていない行を読み取ることができます。これは問題につながる可能性があり、ダブル理論的には同じ行の読み取り。

于 2009-10-13T20:58:48.320 に答える
0

その記事では、データベース マネージャーによって解消される問題の 1 つとして、コミットされていないデータへのアクセスについて言及しています。

データベース マネージャーは、次のような望ましくない影響を防ぐために、このアクセスを制御します。

...

  • コミットされていないデータへのアクセス。

MySQL の InnoDB ストレージ エンジンは、複数のトランザクション分離レベルをサポートしています。詳細については、http://dev.mysql.com/doc/refman/5.4/en/set-transaction.html を参照して ください

于 2009-10-13T21:12:41.903 に答える
0

一部のデータベースの一部のバージョンでは、コミットされていない読み取りができるようにクエリを設定すると、ロックが減少するため、パフォーマンスが向上します。それでも、セキュリティ、信頼性、およびスケーラビリティに関する疑問は解決されていません。

具体的に言うと、私は非常に大きな電子商取引サイトで働いていました。データは頻繁にアクセスされ、頻繁に変更されず、コミットされていないデータの読み取りに関する懸念に敏感ではないため、ストア カタログへの読み取りではコミットされていない読み取りを使用しました。いずれにしても、注文に使用されたカタログのデータは再検証されます。これは、ロック パフォーマンスの問題があることが知られている SQL Server 2000 で行われました。新しいバージョンの SQL Server では、ロックのパフォーマンスが改善されているため、これは必要ありません。

于 2009-10-13T21:19:47.747 に答える