2

MSDNは、OLEDB プロバイダーの JET トランザクションの分離について次のように説明しています。

Jet は、トランザクションで 5 レベルのネストをサポートしています。トランザクションでサポートされている唯一のモードは、Read Committed です。より低いレベルのトランザクション分離を設定すると、Read Committed が意味されます。より高いレベルを設定すると、StartTransaction が失敗します。

Jet は、単一フェーズ コミットのみをサポートします。

MSDNは次のように説明Read Committedしています。

データの読み取り中は共有ロックを保持してダーティ リードを回避することを指定しますが、トランザクションの終了前にデータが変更される可能性があるため、反復不可能な読み取りまたはファントム データが発生する可能性があります。このオプションは、SQL Server のデフォルトです。


私の質問は次のとおりです。

  1. 単一フェーズ コミットとは これは、トランザクションと分離にどのような影響を及ぼしますか?

  2. 上記の Read Committed 分離レベルは、ここでの私の要件に適していますか?

  3. Jet を使用してシリアライズ可能なトランザクション分離を実現する最善の方法は何ですか?
4

1 に答える 1

1

質問番号順:

  1. 単一フェーズ コミットは、すべてのデータが 1 つのデータベースにある場合に使用されます。トランザクションのアクティビティはアトミックにコミットされ、完了です。複数のストレージ エンジン (メタデータ用のリレーショナル データベースや大きな BLOB 用のある種のドキュメント ストアなど) に分散する必要がある論理トランザクションがある場合は、トランザクション マネージャーを使用してアクティビティを調整し、作業が永続化されるようにすることができます。両方の製品が2 フェーズ コミットをサポートしている場合は、両方またはどちらでもない。2 フェーズ コミットをサポートしていないため、この製品は分散トランザクションには適していないと言っているだけです。

  2. はい、UPDATEステートメント自体の条件をチェックすれば; そうしないと、問題が発生する可能性があります。

  3. 彼らはあなたができないことを示唆しているようです。

余談ですが、私は何十年もの間、さまざまな環境でコンサルタントとして働いてきました。パフォーマンスの問題が原因で、人々を Jet から移行することに何度も関与しました。あるケースでは、単純な「スター」タイプのクエリが 2 分間実行されていました。これは、データベースに実行させるのではなく、クライアントに参加させていたためです。データベースに対する直接クエリとしては、1 秒未満でした。別のケースでは、Jet を介して実行するのに 72 時間かかったレポートがあり、データベースに対して直接実行すると 2 分かかりました。通常は問題なく動作する場合は、Jet がパフォーマンスの低下を引き起こしているストアド プロシージャを使用することで、このような状況に対処できる可能性があります。

于 2012-08-18T12:36:23.957 に答える