7

アプリケーション内のすべてのサービスメソッドの周りにDBトランザクションを配置するためのオーバーヘッドが追加されますか?

現在、DBトランザクションは、明示的/明白な必要性がある場合にのみ使用しています。最近、すべてのサービスメソッドに関するトランザクションを提案しましたが、他の開発者の中には慎重な質問をしました。これによりオーバーヘッドが増えるのでしょうか。

私の気持ちはそうではありません-自動コミットはDBの観点からはトランザクションと同じです。しかし、これは正確ですか?

DB:MySQL

4

3 に答える 3

4

正解です。自動コミットを使用すると、すべてのステートメントがトランザクションにラップされます。サービスメソッドが複数のSQLステートメントを実行している場合は、それらをトランザクションにラップすることをお勧めします。詳細については、この回答をご覧ください。この件に関するすばらしいブログ投稿があります

そして、あなたの質問に答えるために、はい、トランザクションはパフォーマンスのオーバーヘッドを追加しますが、特定のケースでは、サービスメソッドで長時間実行されるステートメントがない限り、自動コミットがすでに有効になっているため、違いに気付くことはありません。トランザクションに参加する。複数のステートメントをトランザクション内にラップするだけで、ここで指摘するように(個々のステートメントごとのトランザクションではなく)1つのトランザクションを取得します(「自動コミットが有効になっているセッションは、明示的に開始することで複数のステートメントのトランザクションを実行できますSTART TRANSACTIONまたはBEGINステートメントを実行し、COMMITまたはROLLBACKステートメントで終了します」)。これにより、サービスメソッドレベルでアトミック性を実現できます。

最後に、サービスメソッドレベルでアトミック性を達成するという観点からそれが理にかなっている場合は、あなたのソリューションを使用します(これはあなたが達成したいと思います)が、パフォーマンスに+と-の影響があります。クエリ、リクエストなど...

于 2012-02-14T04:22:14.940 に答える
0

はい、オーバーヘッドを追加できます。トランザクションを相互に分離するために必要な余分な「簿記」は、特にトランザクションが長期間開いたままになっている場合に重要になる可能性があります。

于 2012-02-14T04:25:43.147 に答える
0

簡単に言うと、テーブルの種類によって異なります。デフォルトのMyISAMを使用している場合、実際にはトランザクションがないため、パフォーマンスに影響はありません

しかし、とにかくそれらを使用する必要があります。トランザクションがなければ、作業の境界はありません。InnoDBまたはPostgreSQLのような実際のデータベースにアップグレードする場合は、とにかくこれらのトランザクションをサービスメソッドに追加する必要があるため、コストをかけずに今すぐ習慣にすることもできます。

その上、あなたはすでにトランザクションストアを使用しているはずです。現在、サービスメソッドが失敗した場合、どのようにクリーンアップしますか?データベースに情報を書き込んだ後、サービスメソッドが例外をスローした場合、その不完全または誤った情報をどのようにクリーンアップしますか?トランザクションを使用している場合は、そうする必要はありません。データベースはロールバックされたデータを破棄します。または、メソッドの途中で別のリクエストが届き、半分書き込まれたデータが見つかった場合はどうしますか?まだそこにない残りの半分を探しに行くとき、それは爆発するだろうか?トランザクションデータストアがこれを処理します。トランザクションは互いに分離されているため、部分的に書き込まれたトランザクションを他の人が見ることはできません。

データベースのすべてと同様に、唯一の決定的な答えは、現実的なデータと現実的な負荷を使用したテストから得られます。データベースに関しては、データが大きい場合とそうでない場合で非常に異なるコードパスがアクティブ化されるため、疑わしいことに関係なく、常にこれを行うことをお勧めします。しかし、InnoDBを使用してもトランザクションを使用するコストはそれほど大きくないと強く思います。結局のところ、これらのシステムは、トランザクションのパフォーマンスに依存する大小の組織によって、毎日、絶えず頻繁に使用されています。MVCCはほとんどオーバーヘッドを追加しません。メリットは膨大で、コストは低くなります。それらを使用してください。

于 2012-02-14T04:33:35.037 に答える