2016-11-24 8 views
2

カスタムセキュリティメカニズムを適用するWeb APIを構築しています。操作が承認されているかどうかを確認するには、トランザクション内のデータベースに変更を保存し、その後にコミットまたはロールバックを行う必要があります。ここでトランザクション中にデータベースのSELECTを防ぐ

は私がやっている何の簡易版である:私は必要

public IHttpActionResult Post(Account account) 
{ 
    using (DbContextTransaction transaction = Context.Database.BeginTransaction()) 
    { 
     Context.accounts.Add(account); 

     Context.SaveChanges(); 

     // This will do one or several SELECTs on the database to do the verification 
     RollbackIfForbidden(transaction, account); 

     transaction.Commit(); 
    } 

    return Ok(); 
} 

何トランザクションがコミットまたはロールバックされるまで、テーブル(またはデータベース)をロックし、私の取引でIsolationLevelを設定することです。このロックは、RollbackIfForbiddenによって送信されたクエリの場合はを除き、データベースで行われたクエリをすべて以外に遅延させるはずです。

これは、彼らがContext.SaveChanges();transaction.Commit();間でデータベースを照会それでもRollbackIfForbidden(transaction, account);内で行わ任意のクエリを受け入れた場合、誤ったデータを取得するために人々を防ぐことができるようになります。

編集:ユーザーがアカウントエンティティを作成するには、POSTのクエリを送信

  1. ユーザーストーリー。

  2. サービスはトランザクションを開始し、そのアカウントをデータベースに格納します。
  3. データベースは、(トリガーまたは制約を使用して)エンティティに対していくつかの変更を適用できます。
  4. サービスは、新しいアカウントにデータベースによって加えられた変更を照会します。
  5. サービスは、現在のユーザーがこの特定のアカウントを作成する権限を持っていることを確認します(ユーザーが入力した値とデータベースが完了したことに基づいて)。
  6. サービスはユーザーが許可されている場合はコミットを行い、彼が禁止されている場合ロールバックする。
  7. サービスは、操作のステータス(成功またはエラー)を返します。私の問題は、それがステップ6 で除去することができる一方で、ステップ2と6の間に、別のユーザーがだから私は、データベースをロックする必要があるデータベースにクエリを実行し、作成したアカウントを取得することである

その間にも、私はエンティティの新しい値を取得するために、手順4でデータベースにクエリを行う必要があります。

+0

'SaveChanges'方法トランザクションに組み込まれていたトランザクションのためのあなたのロックを設定するsp_getapplockを使用することができますが、それはしないのですか? –

+0

@LeiYangエラーが発生した場合にロールバックを実行できるようにするために、特定のトランザクションを使用する必要があります。 'SaveChanges'メソッドに組み込みのトランザクションがある場合、私はそれにアクセスできないと私には役に立たないです。しかし、私の質問は、トランザクション中にデータベースをロックする方法です。 – Vyrira

+0

あなたは私たちに**ユーザーストーリーを与えることができます**なぜそのような取引が必要ですか? –

答えて

関連する問題