2009-04-27 26 views
34

Tôi đang cố gắng sử dụng TransactionScope, nhưng tiếp tục nhận được ngoại lệ bên dưới. Ứng dụng đang chạy trên một máy tính khác với cơ sở dữ liệu, nếu điều đó quan trọng. Tôi đang sử dụng Sql Server 2005.Làm cách nào để sử dụng TransactionScope trong C#?

"Truy cập mạng cho Trình quản lý giao dịch phân tán (MSDTC) đã bị tắt. Vui lòng bật DTC để truy cập mạng trong cấu hình bảo mật cho MSDTC bằng công cụ Dịch vụ thành phần."

using (TransactionScope tsTransScope = new TransactionScope()) 
{ 
    //Do stuff here 
    tsTransScope.Complete(); 
} 

Sửa

tôi thực hiện một số hiện thay đổi dựa trên những phản hồi. Bây giờ tôi nhận được lỗi này:

{"Error HRESULT E_FAIL has been returned from a call to a COM component."} 
{"Communication with the underlying transaction manager has failed."} 

Giải pháp Tôi nghĩ câu trả lời chấp nhận khắc phục sự cố ban đầu tôi đã nhận được. Lỗi thứ hai có vẻ là cụ thể đối với khung thực thể. Tôi sẽ đăng một câu hỏi khác cho nó.

Dưới đây là các thuộc tính trên máy khách: Client http://www.portnine.com/data/images/Misc/client.jpg

Dưới đây là các thuộc tính trên máy chủ:

Server http://www.portnine.com/data/images/Misc/server.jpg

+0

Không Bạn có còn hình ảnh mà bạn đã liên kết để chạy quanh không? Nếu vậy, sẽ rất tuyệt khi đăng lại chúng để khắc phục sự thật rằng chúng hiện đang bị hỏng tham chiếu hình ảnh. – ahsteele

Trả lời

31

Bạn cần bật truy cập DTC mạng như được mô tả trong Microsoft TechNet Article này. Thay đổi này có thể phải được thực hiện trên cả cơ sở dữ liệu và máy chủ ứng dụng. Thông thường, DTC đã bật máy chủ cơ sở dữ liệu nên trước tiên tôi sẽ xem xét máy chủ ứng dụng.

Đây là một ảnh chụp màn hình về những gì chúng tôi sử dụng ngoại trừ "Cho phép quản trị từ xa" tùy chọn: Security Configuration Screenshot

tôi đã không chạy vào các vấn đề HRESULT E_FAIL bây giờ bạn đang có nhưng bài viết này trên XP SP2 and transactions có thú vị này gợi ý:

Another configuration setting that you need to be aware (although I consider it to be an uncommon scenario) is RestrictRemoteClients registry key. If the value of this key is set to 2 (RPC_RESTRICT_REMOTE_CLIENT_HIGH) then MSDTC network transactions will not be able to work properly. MSDTC supports only RPC_RESTRICT_REMOTE_CLIENT_NONE (0) and RPC_RESTRICT_REMOTE_CLIENT_DEFAULT (1) values. See http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx#XSLTsection128121120120 for more info on RestrictRemoteClients.

Cuối cùng, trong khi không cụ thể cho vấn đề của bạn là một điều rất quan trọng cần lưu ý về việc sử dụng lớp TransactionScope là thiết lập mặc định của nó là sử dụng một Transaction Isolation Level of Serializable. Serializable là hạn chế nhất của các mức cô lập và thẳng thắn đáng ngạc nhiên rằng nó đã được chọn làm mặc định. Nếu bạn không cần trình độ này của khóa tôi rất muốn khuyên bạn nên thiết lập mức cô lập để một lựa chọn ít hạn chế (ReadCommitted) khi instantiating một TransactionScope:

var scopeOptions = new TransactionOptions(); 
scopeOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
scopeOptions.Timeout = TimeSpan.MaxValue; 

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
    scopeOptions)) 
{ 
    // your code here 
} 
+0

Tôi nhận ra từ ảnh chụp màn hình của bạn, bạn không sử dụng XP, nhưng tôi nghĩ rằng bài viết XP SP2 có thể áp dụng. – ahsteele

+0

Tôi nghĩ điều này đã khắc phục được vấn đề ban đầu mà tôi nhận được. Lỗi thứ hai có vẻ là cụ thể đối với khung thực thể. Tôi sẽ đăng một câu hỏi khác cho nó. – NotDan

+2

Cuối cùng tôi đã sửa lỗi này. Windows Firewall đã chặn các kết nối tới MS-DTC. – NotDan

0

Nếu bạn đang sử dụng SQL Server 2000, System.Transactions.TransactionScope sẽ gây ra tất cả các giao dịch sẽ được quảng bá cho Giao dịch phân phối, yêu cầu Điều phối viên giao dịch phân tán MS phải chạy.

Bạn có thể khắc phục điều này bằng cách bắt đầu dịch vụ MSDTC, nâng cấp lên SQL Server 2005, hoặc thực hiện một cái gì đó giống như giải pháp CodeProject tôi: http://www.codeproject.com/KB/database/typed_dataset_transaction.aspx

Tôi chưa bao giờ cần thiết để làm điều đó, nhưng bạn cũng nên kiểm tra câu trả lời Ocdecio cho cũng định cấu hình cài đặt bảo mật mạng cho DTC.

+0

Đã thêm ghi chú ở trên, tôi đang sử dụng Sql Server 2005 – NotDan

2

Bảng điều khiển - Công cụ quản trị - Dịch vụ thành phần - Thuộc tính máy tính của tôi - tab MSDTC - tab Cấu hình bảo mật - Truy cập DTC mạng (được chọn)/Cho phép khách hàng từ xa (được chọn)/Allow Inbound (checked)/Allow Outbound (checked)/Bật Giao dịch TIP (đã chọn)

Khởi động lại máy tính.

+0

cảm ơn tôi đã bỏ lỡ phần máy tính khởi động lại. – melaos

2

Tùy thuộc vào chương trình phụ trợ bạn đang sử dụng, TransactionScope thường yêu cầu bật Trình quản lý giao dịch phân tán. Một số chi tiết là on this MSDN blog.

Ngoài ra, nếu bạn sử dụng nhiều tài nguyên, DTC có thể được yêu cầu. Bật DTC có thể được yêu cầu trong trường hợp của bạn hoặc đảm bảo bạn đang sử dụng SQL Server 2005 và gắn bó với những gì sẽ có thể thực hiện được trong các giao dịch nhẹ.

1

Bạn cần bật DTC để truy cập mạng trong cấu hình bảo mật cho MSDTC bằng công cụ Quản trị dịch vụ thành phần.

0

Bạn cần phải bật mạng truy nhập DTC cho cả máy chủ cơ sở dữ liệu và máy chủ nơi ứng dụng chạy.

Bạn cũng sẽ cần phải xác minh rằng các kết nối sẽ không bị chặn bởi tường lửa. Vì một kết nối sẽ được khởi tạo từ máy chủ cơ sở dữ liệu đến máy ứng dụng, điều quan trọng không kém là thêm MSDTC vào danh sách các ngoại lệ tường lửa trên máy ứng dụng.

0

Tôi gặp sự cố tương tự khi chạy kiểm tra tích hợp.

tôi đăng một câu hỏi về vấn đề này here

nhưng cuối cùng tôi tìm thấy một con đường xung quanh nó. Mặc dù, tôi sẽ không khuyên bạn nên làm điều đó cho mã sản xuất. Tôi đã làm nó trong bối cảnh thử nghiệm.

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