質問

新しいユーザーエンティティを作成できる必要があります 場合にのみ 提供されたメールはユニークです。

シンプルを実行することで、私はいつもこれを以前に処理しました if (!UserSet.Any(...)) 私の前 AddToUserSet(...). 。ただし、これは同時ソリューションではなく、重い負荷の下で壊れます。

私はトランザクションを検討してきましたが、afaikはselectにもupdlockを設定する必要がありますが、EF4はこれをサポートしていません。

他の誰もがこれをどのように処理しますか?

役に立ちましたか?

解決

トランザクションにselectを含めることにより、ロックを強制することができます。

using (var scope = new TransactionScope())
{
    // Create context
    // Check non existing email
    // Insert user
    // Save changes
}

これにより、挿入物の同時ソリューションが必要な場合に必要なシリアル化可能なトランザクションが使用されます。アップロックは、トランザクション中に新しいレコードが追加されないことを保証するのに十分ではありません。

これはかなり悪いボトルネックになる可能性があるため、@paoloに同意します。電子メールが一意でない場合は、挿入中にデータベースに一意の制約を配置し、挿入中に例外をキャッチするだけです。

からのシリアル化可能なトランザクション オンラインで本:

以下を指定します。

    Statements cannot read data that has been modified but not yet  
    committed by other transactions.

    No other transactions can modify data that has been read by the  
    current transaction until the current transaction completes.

    Other transactions cannot insert new rows with key values that
    would fall in the range of keys read by any statements in the current
    transaction until the current transaction completes.

レンジロックは、トランザクションで実行された各ステートメントの検索条件に一致するキー値の範囲に配置されます。これにより、現在のトランザクションによって実行されたステートメントのいずれかの資格がある行を更新または挿入する他のトランザクションがブロックされます。これは、トランザクション内のステートメントのいずれかが2回目に実行された場合、同じ行のセットを読み取ることを意味します。レンジロックは、トランザクションが完了するまで保持されます。これは、キーの範囲全体をロックし、トランザクションが完了するまでロックを保持するため、分離レベルの中で最も制限的です。並行性は低いため、必要な場合にのみこのオプションを使用してください。このオプションは、トランザクション内のすべての選択ステートメントのすべてのテーブルにHoldLockを設定することと同じ効果があります。

他のヒント

小切手に加えて、 ユニークな制約 DBの電子メールフィールドに直接フィールド

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top