2012-12-18 96 views
0

沒有添加任何特殊設置,在最後一個submitchanges()的情況下,linq到sql datacontext的行爲如何?我的數據庫是在MSSQL服務器上Linq DataContext和隔離級別

我很困惑,交易什麼時候開始。請看下面的僞代碼言過其實:

DataContext dc= new DataContext(); 
Thread.Sleep(10 min); 
var rs = from a in dc.myTable Where.. select r; 
............. 
............. 
............. 
use rs //but do nothing to edit myTable.May be loop over it(?) to force execution 
............. 
............. 
Thread.Sleep(10 min); 
//read again, same criteria as before 
rs = from a in dc.myTable Where.. select r; 
............. 
............. 

dc.SubmitChanges() 
  1. 如果我沒有明確更改任何設置的任何地方,代碼和數據庫。即使其他人在符合我的選擇標準的表中插入(並提交)了新的行,我的rs第二次會返回相同的結果嗎?
  2. 什麼時候linq的隱式事務開始在什麼時候開始?什麼時候DataContext被實例化?或者,根據我們在DataContext中做什麼(或不這樣做),何時調用dc.SubmitChanges()?

回答

0
  1. 當你沒有明確在特定的隔離級別開始交易,你的閱讀以外發生的交易,並在默認的隔離級別,我相信這是提交讀運行。如果在執行這兩個查詢之間某些其他用戶插入符合條件的其他記錄,它們將顯示在第二個查詢的結果中。
  2. 隱式事務是在實際數據提交給數據庫並立即提交之前啓動的。如果您多次撥打SubmitChanges,每個電話都會有一筆交易。

至於第一個問題:如果你運行事務中的查詢,小心你使用的隔離級別,以及表鎖定升級的政策是如何設置的。默認情況下,如果使用using (var scope = new TransactionScope()),則第一個查詢將導致表被鎖定。希望插入記錄的其他用戶最終會等待一段時間,並由於超時而拒絕其操作。詳細瞭解隔離級別here