2010-08-26 148 views
0

我遇到了我的應用程序中的情況,我需要使用表鎖提示或將事務隔離級別設置爲默認的Read Committed以外的其他方式,以解決死鎖問題。我正在使用面向服務的體系結構,每個服務調用都作爲一個原子操作進行操作,並且Linq To Sql充當輕量級DAL。每個服務電話叫我的業務層,並宣佈新的交易是這樣的:TransactionScope需要多個隔離級別?

using (var scope = new TransactionScope()) 
{ 
    // Get datacontext 

    // do Business Logic stuff, including database operations via Linq To Sql 

    // Save transaction 
    scope.Complete(); 
} 

的問題是,需要很多數據庫操作有時我有複雜的業務邏輯。一些讀取,一些寫入,一些讀取更新等,全部在相同的服務調用中,並且因此是相同的事務。

我已閱讀關於Linq To Sql無法向您的linq查詢添加表鎖定提示的問題,建議使用TransactionScope隔離級別的解決方案。這很好,但在我的情況下,每個事務都是爲了一個原子服務調用的目的,我不知道這會起作用。例如,如果我需要在不鎖定的情況下讀取一個表,並且髒讀可能沒有問題,請轉至另一個讀取以進行更新,然後執行更新。我不想爲整個交易設置Read Uncommitted,只有一個特定的閱讀,那麼我該怎麼辦?

是不是有一個擴展我能實現,這將讓我補充表鎖提示,而無需使用視圖或存儲過程,或使用datacontext.ExecuteQuery(「我在這裏的原始的SQL字符串」)

回答

0

我覺得這裏最好的答案是使用多個事務,並批量處理在一個批處理中只讀取「髒」的事務,以及需要在另一個批處理中提交讀取的更新。如果有任何信息需要跨批次處理,請在內存緩存中爲該數據設置臨時文件。