2009-03-23 48 views
36

Tôi đã tự hỏi làm thế nào bạn sẽ sử dụng lớp TransactionScope một cách chính xác khi bạn đang xử lý đa luồng?TransactionScope và đa luồng

Chúng tôi tạo một phạm vi mới trong chuỗi chính của chúng tôi và sau đó chúng tôi tạo ra một vài chuỗi công việc và chúng tôi muốn chúng tham gia vào phạm vi chính, ví dụ: rollback được gọi trên mỗi nhân viên nếu phạm vi không bao giờ hoàn thành.

Tôi đọc điều gì đó về TransactionScope bằng cách sử dụng ThreadStaticAttribute bên trong mà làm cho trên không thể/rất khó - ai đó có thể xác minh một trong hai cách? Nếu chúng ta chạy mã theo kiểu được đồng bộ hóa thì thao tác quay lại, nghĩa là các giao dịch bên trong có thể tham gia vào giao dịch chính, nhưng không phải nếu chúng ta chuyển sang thực thi luồng.

Cảm ơn

+1

Câu hỏi hay; đây là một kịch bản mà tôi đã đơn giản bác bỏ là "không làm điều đó", nhưng khi điều tra, có sự hỗ trợ thông qua DependentTransaction. Tôi đã học được điều gì đó, cảm ơn. –

Trả lời

28

Xem MSDN:

Bạn cũng nên sử dụng TransactionScope và lớp DependentTransaction cho ứng dụng đòi hỏi việc sử dụng các cùng một giao dịch trên nhiều gọi hàm hoặc nhiều chủ đề cuộc gọi .

Vì vậy, có thể xem xét DependentTransaction - đặc biệt, có ví dụ về chuỗi công nhân, here.

+0

Tôi cũng tìm thấy hai bài đăng trên blog này hữu ích: http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx và http://www.pluralsight.com/community/ blog/jimjohn/archive/2005/05/01/7923.aspx –

+2

đó là điều tuyệt vời, blog đó không được tìm thấy bây giờ – Kiquenet

+0

@Kiquenet Trong những trường hợp như [this] (http://web.archive.org/web/2/http : //pluralsight.com/community/blogs/jimjohn/archive/2005/04/14/7332.aspx) [hai] (http://web.archive.org/web/2/http://pluralsight.com /community/blogs/jimjohn/archive/2005/05/01/7923.aspx), có (hầu hết) luôn luôn [máy rút tiền] (https://en.wikipedia.org/wiki/Wikipedia:Using_the_Wayback_Machine#Latest_archive_copy) –

17

Điều này là chính xác: lớp TransactionScope sử dụng thuộc tính Transaction.Current lưu trữ giá trị của nó trong trường, được đánh dấu bằng thuộc tính ThreadStatic.

Thuộc tính ThreadStatic đảm bảo rằng giá trị trường nhận được mối quan hệ luồng, nghĩa là giá trị đó có giá trị duy nhất trong mỗi chuỗi. Đó là phương pháp được đề xuất để chia sẻ ngày trong phạm vi một chuỗi. Nó còn được gọi là Thread Local Storage (TLS).

Lớp TransactionScope chỉ xác định ngữ cảnh giao dịch trong chuỗi hiện tại. Tuy nhiên, điều đó không có nghĩa là của bạn phải hoàn thành tất cả công việc trong chuỗi đó. Tôi có thể tưởng tượng một thuật toán tính toán phức tạp sử dụng nhiều luồng.