2011-09-16 12 views
3

データベース(JavaやMySqlなど)を使用してプログラムを作成する場合、挿入する前に重複しているエントリをチェックするか、重複した例外を挿入してキャッチしてユーザーに警告する必要がありますか?重複を確認するか、データベースから例外をキャッチする必要がありますか?

私の意見では、チェックを行い、エントリが重複していなければエントリを挿入し、データベースエンジン自体が重複した主キーを再度チェックします。それは時間の無駄に聞こえる。

あなたはどう思いますか?

答えて

8

重複したキーがある場合にクライアント側(プログラム内)を確認するには、データベースにクエリする必要があります。同じPKを持つレコードが既に存在する場合、挿入クエリはエラーを返すので、挿入ステートメントが送信される前にこのチェックを実行する必要はありません。
例外/エラーコード(Javaで例外が発生するかどうか、またはエラーコードを返すかどうかはわかりません)を挿入して、ユーザーに警告することができます。

EDIT -
同じデータベースを使用して、多くのユーザーが存在する場合は、あなたがチェックした後、挿入した場合の主な問題は、他の誰かが、あなたがチェックした後、同じキーを挿入することができますが、あなたが挿入する前にいることになります。このようにしたい場合は、トランザクションを使用する必要があります。チェックと挿入の両方が同じトランザクション内で行われる必要があります。あなたはMySQLトランザクションhereを読むことができます。

+0

これも私の考えです! Tks! – hirikarate

+0

これは偶然による正解です。 check-then-insertの* main *の問題は競合状態です。あなたがチェックした後に*誰かが*挿入する前に同じキーを挿入することができます。 check-then-insertが信頼できるものであるためには、チェックと挿入の両方が同じトランザクション内で行われなければならないが、トランザクションはまったく言及されていない。 -1これを修正するまで –

+0

@j_random_hacker:ありがとうございます。 :)私はアドバイスとして私の答えを変更しました。私は(明らかに)私はこれに答えたときにトランザクションについてはなかった。 –

3

無駄な時間はあなたの最大の関心事ではありません。

複数のユーザー(またはプロセス)がいつでもデータベースにアクセスできると仮定しています。純粋に「プリ・インサート」チェックに頼っている場合は、チェックとあなたの間の時間内に、別のユーザーがデータベースの状態を変更することがあります(挿入しようとしているIDのレコードを挿入するなど)挿入ステートメント。

このように、「重複キー」エラーは常にユーザーフレンドリーな方法で処理する必要があります。

しかし、現在のユーザーインターフェイスでは、データをデータベースに送信する前に検証し、の両方でデータの整合性エラーをうまく処理しているようです。

これにはいくつかの理由があります。ユーザーの利便性は優れていますが、効率とパフォーマンスも大きな問題です。ほとんどのアプリケーションでは、データベースは「希少なリソース」であり、アプリケーションロジックのエラーに依存することは費用がかかり、非効率的です。

したがって、単一のレコードを単一のテーブルに挿入する場合は、「重複キー」例外を使用すると問題はありません。複数のレコードを複数のテーブルに挿入する場合は、外部キーなどを使用してトランザクションを1つまたは2つ(例外なく)使用することはコストがかかり、多くの「ロールバック」作業を必要とします。

MySQLでは、これはトランザクションのさまざまなサポート(使用するバージョンとストレージオプションによって異なる)によって悪化します。

関連する問題