2017-08-24 1 views
0

私は以下のようなトランザクションを実行する必要があります。EF6読むコミットされていないデータ

  1. 開始トランザクション:ここで私はここにcontextは、私がコミットされていない読んでもらいたい質問に以下のものと同じではないことに注意してください(context.Database.BeginTransaction()呼び出します)
  2. 連絡先を保存する(ストアドプロシージャを使用して実行):このuspにはトランザクションもあります。
  3. 接触に基づいていくつかの他のレコードを作成します(EFアプリケーション側を使用して行う)
  4. は、私はに実行している問題は、ステップ3で、私はどのデータベースからいくつかのデータを読み込む必要があるということです

をコミットまだコミットされていない(ステップ2から)。私はこれをやってみましたが、それは動作していない:

context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
var contact = context.Contact.SingleOrDefault(x => x.ContactId == intId); 
context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ COMMITTED;"); 

私は、デバッガを実行しているとcontactをフェッチしている時点で一時停止し、何も返されません。

set transaction isolation level read uncommitted 
select * from Contact c where c.ContactId = 9999 

質問私はEF6を使用してコミットされていないデータを読み取ることができますどのように

  1. :私はSSMS(SQLサーバーのMGMTスタジオ)で同じレコードを照会した場合

    が、それは結果を返しますか?オンラインで検索すると、カスタムインターセプタを作成するように誘導されますが、本当に必要なのでしょうか?

  2. 多くの記事は、コミットされていないデータを読み込まないように提案していますが、これを達成する別の方法は考えられません。ある?
+0

実際には手順1は何ですか。 'var tr = context.Database.BeginTransaction();'を実行すると、同じ 'context'を使った将来の操作では、そのトランザクションのコミットされていない変更が見えます。 –

+0

@IvanStoevこれは単純に 'this.context.Database.BeginTransaction();'ですが、これは質問内のものと同じコンテキストではありません。私は見る。 – CodingYoshi

+0

その後、 'BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)'を試してみてください、それは動作するようです(クイックテスト)。 –

答えて

0

あなたがそうのように、TransactionScopeでデータベース・アクセス・コードをラップしてみてください可能性がありますどのようにあなたのトランザクションを開始している

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
       new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 

?コードフローが記述されている場合は、手順2と3の操作はすべて同じトランザクション内で実行する必要があり、そのトランザクションは同じトランザクション内の以前の操作によって加えられた変更を参照できなければならないからです。

また、SQL Server Profilerを使用してデータベースの操作を監視し、追加の(新しい)トランザクションが作成されているかどうかを確認することもできます。

手順1〜4を実行する実際のコードを投稿した場合に役立ちます。

+0

私は私の質問を編集しました。はい、他の取引があります。 – CodingYoshi

関連する問題