私は以下のようなトランザクションを実行する必要があります。EF6読むコミットされていないデータ
- 開始トランザクション:ここで私はここに
context
は、私がコミットされていない読んでもらいたい質問に以下のものと同じではないことに注意してください(context.Database.BeginTransaction()
呼び出します) - 連絡先を保存する(ストアドプロシージャを使用して実行):このuspにはトランザクションもあります。
- 接触に基づいていくつかの他のレコードを作成します(EFアプリケーション側を使用して行う)
- は、私はに実行している問題は、ステップ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を使用してコミットされていないデータを読み取ることができますどのように
- :私はSSMS(SQLサーバーのMGMTスタジオ)で同じレコードを照会した場合
が、それは結果を返しますか?オンラインで検索すると、カスタムインターセプタを作成するように誘導されますが、本当に必要なのでしょうか?
- 多くの記事は、コミットされていないデータを読み込まないように提案していますが、これを達成する別の方法は考えられません。ある?
実際には手順1は何ですか。 'var tr = context.Database.BeginTransaction();'を実行すると、同じ 'context'を使った将来の操作では、そのトランザクションのコミットされていない変更が見えます。 –
@IvanStoevこれは単純に 'this.context.Database.BeginTransaction();'ですが、これは質問内のものと同じコンテキストではありません。私は見る。 – CodingYoshi
その後、 'BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)'を試してみてください、それは動作するようです(クイックテスト)。 –