2017-08-24 58 views
0

我需要像下面進行交易:EF6提交的數據讀

  1. 開始交易:在這裏,我呼籲context.Database.BeginTransaction()(請注意context這裏就不下同一個的問題,我想讀未提交)
  2. 保存聯繫(使用存儲過程完成):此usp也有一個事務。
  3. 創建基於接觸一些其他記錄
  4. 提交

我遇到的問題是,在步驟3,我需要從數據庫中讀取一些數據(使用EF應用端做),這尚未提交(從第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,正在獲取的暫停,但什麼都不會返回。

如果我查詢的SSMS(SQL服務器MGMT工作室)相同的記錄,它返回的結果:

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

問題

  1. 我怎樣才能讀取使用EF6未提交的數據?一些在線搜索引導我創建一個自定義攔截器,但我真的需要嗎?
  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