2011-11-18 40 views
6

Nếu tôi làm như sau:TransactionScope không hoạt động với phần mở rộng song song?

Using scope = New TransactionScope() 
     entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(Sub(entry) 
                      _repos.Update(entry) 
                     End Sub) 
     scope.Complete() 
    End Using 

TransactionScope không hoạt động. Nếu tôi đặt một điểm ngắt trên scope.complete không có giao dịch nào đang hoạt động và các bản cập nhật đã hoàn tất.

Nếu tôi thay đổi nó để:

Using scope = New TransactionScope() 
      entries.Content.ReadAs(Of IList(Of WebMaint)).ToList().ForEach(Sub(entry) 
                       _repos.Update(entry) 
                      End Sub) 
      scope.Complete() 
End Using 

Tất cả mọi thứ hoạt động như mong đợi. Bất cứ ai biết tại sao phiên bản song song không hoạt động chính xác?

Trả lời

4

Tôi không biết nó là công nghệ gì, nhưng các giao dịch thông thường là chuỗi bị ràng buộc và không truyền đến chủ đề con. Điều đó đang được nói rằng bạn sẽ phải bắt đầu một giao dịch mới trong mỗi luồng. Nhưng điều này có nghĩa là bạn sẽ có nhiều giao dịch độc lập làm chủ đề.

Giới hạn này là hợp lý vì giao dịch được kết nối với kết nối cơ sở dữ liệu SQL cơ bản là một luồng đơn.

4

Bạn có thể tuyên truyền giao dịch với chủ đề người lao động như sau:

Using scope = New TransactionScope() 
    Dim rootTransaction As Transaction = Transaction.Current 

    entries.Content.ReadAs(Of IList(Of WebMaint)).AsParallel.ForAll(
     Sub(entry)  
      Dim dependentTransaction As DependentTransaction = rootTransaction.DependentClone(DependentCloneOption.RollbackIfNotComplete) 

      _repos.Update(entry) 

      dependentTransaction.Complete() 
     End Sub)   

    scope.Complete() 
End Using 

LƯU Ý: xin vui lòng tha thứ cho bất kỳ vấn đề cú pháp VB, 'tis không tiếng mẹ đẻ của tôi

Các vấn đề liên quan