Người quản lý giao dịch đã vô hiệu hóa hỗ trợ của nó cho các giao dịch từ xa / mạng


86

Tôi đang sử dụng SQL Server và ASP.NET. Tôi có chức năng sau:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

Tuy nhiên, ngoại lệ ' Người quản lý giao dịch đã vô hiệu hóa hỗ trợ của nó cho các giao dịch từ xa / mạng. ' được ném.

Mô tả của JoinScope:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

Tôi đã làm việc theo cách này trong một ứng dụng khác có cùng môi trường mà không gặp sự cố, nhưng ở đây tôi gặp sự cố này. Tôi có thể làm gì để khắc phục sự cố?


Tôi đã thực hiện các bước mà Magnus đề xuất trước để đảm bảo rằng tôi đã có tất cả các cơ sở, có thể nói, và sau đó quản lý để nhận được lỗi đề xuất rằng bộ tôi bật clr trong SQL Server và điều đó đã làm việc cho tôi. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Câu trả lời:


141

Đảm bảo rằng Dịch vụ "Điều phối viên giao dịch phân tán" đang chạy trên cả cơ sở dữ liệu và máy khách. Đồng thời đảm bảo rằng bạn kiểm tra "Truy cập DTC của Mạng", "Cho phép Máy khách Từ xa", "Cho phép Inbound / Outbound" và "Enable TIP".

Để bật Quyền truy cập DTC của Mạng cho các giao dịch MS DTC

  1. Mở phần đính vào Dịch vụ Thành phần.

    Để mở Dịch vụ thành phần, bấm Bắt đầu. Trong hộp tìm kiếm, nhập dcomcnfg, sau đó nhấn ENTER.

  2. Mở rộng cây bảng điều khiển để định vị DTC (ví dụ: DTC cục bộ) mà bạn muốn kích hoạt Truy cập Mạng MS DTC.

  3. Trên menu Hành động, bấm Thuộc tính.

  4. Nhấp vào tab Bảo mật và thực hiện các thay đổi sau: Trong Cài đặt Bảo mật, hãy chọn hộp kiểm Truy cập DTC Mạng.

    Trong Giao tiếp của người quản lý giao dịch, hãy chọn hộp kiểm Cho phép gửi đến và cho phép gửi đi.


3
Cảm ơn bạn, Magnus. Nó phải là một cài đặt của ứng dụng, vì loại giao dịch này hoạt động với cùng một máy tính, có nghĩa là vấn đề này không liên quan đến máy.
Lajos Arpad

Vâng, tôi đã làm. Nó ném cùng một ngoại lệ.
Lajos Arpad

Tôi đoán nó liên quan đến những gì bạn đang thực sự làm bên trong TransactionScope.
Magnus

Ngoài ra, tôi cần phạm vi tham gia, vì tôi muốn giao dịch này được gửi dưới dạng một yêu cầu duy nhất đến máy chủ cơ sở dữ liệu.
Lajos Arpad

13
đảm bảo rằng bạn sử dụng cùng một kết nối mở cho tất cả các lệnh gọi cơ sở dữ liệu bên trong giao dịch.
Magnus

11

Tôi gặp sự cố này không liên tục, tôi đã làm theo hướng dẫn ở đây và những hướng dẫn tương tự ở nơi khác. Tất cả đã được định cấu hình chính xác.

Trang này: http://sysadminwebsite.wordpress.com/2012/05/29/9/ đã giúp tôi tìm ra vấn đề.

Về cơ bản, tôi đã có CID trùng lặp cho MSDTC trên cả hai máy chủ. HKEY_CLASSES_ROOT \ CID

Xem: phần http://msdn.microsoft.com/en-us/library/aa561924.aspx Đảm bảo rằng MSDTC được gán một giá trị CID duy nhất

Tôi đang làm việc với các máy chủ ảo và nhóm máy chủ của chúng tôi thích sử dụng cùng một hình ảnh cho mọi máy chủ. Đó là một bản sửa lỗi đơn giản và chúng tôi không cần khởi động lại. Nhưng dịch vụ DTC cần đặt thành Khởi động tự động và cần phải khởi động sau khi cài đặt lại.


9

Tôi có một thủ tục cửa hàng gọi một thủ tục cửa hàng khác trong "máy chủ được liên kết". Khi tôi thực thi nó trong ssms thì không sao, nhưng khi tôi gọi nó trong ứng dụng (Theo Entity Framework), tôi gặp lỗi này. Bài viết này đã giúp tôi và tôi đã sử dụng tập lệnh này:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

để biết thêm chi tiết, hãy xem phần này: Máy chủ được liên kết: Người quản lý giao dịch đối tác đã vô hiệu hóa hỗ trợ của nó cho các giao dịch từ xa / mạng


1
Liên kết đến một giải pháp được hoan nghênh, nhưng hãy đảm bảo rằng câu trả lời của bạn hữu ích nếu không có nó: thêm ngữ cảnh xung quanh liên kết để những người dùng đồng nghiệp của bạn sẽ biết nó là gì và tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn ' đang liên kết lại trong trường hợp trang đích không có sẵn. Các câu trả lời ít hơn một liên kết có thể bị xóa.
Petter Friberg

1
Điều này đã giải quyết vấn đề của tôi, vì vậy cảm ơn bạn đã cung cấp điều này. Tôi không biết tại sao nó nhận được -1 phiếu bầu, vì nó hoạt động để khắc phục vấn đề cụ thể của tôi.
Boyd P

6

Trong trường hợp của tôi, ngoại lệ đã được ném ra vì tôi đang cố gắng tạo một phiên bản kết nối mới trong TransactionScope trên một kết nối đã có:

Thí dụ:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}

3

Nhận xét từ câu trả lời : "đảm bảo rằng bạn sử dụng cùng một kết nối mở cho tất cả các lệnh gọi cơ sở dữ liệu bên trong giao dịch. - Magnus"

Người dùng của chúng tôi được lưu trữ trong một db riêng biệt với dữ liệu mà tôi đã làm việc với trong các giao dịch. Việc mở kết nối db để lấy người dùng đã gây ra lỗi này cho tôi. Di chuyển kết nối db khác và tra cứu người dùng ra ngoài phạm vi giao dịch đã khắc phục lỗi.


1

Tôi đăng giải pháp dưới đây ở đây bởi vì sau một số tìm kiếm, đây là nơi tôi đã hạ cánh, vì vậy người khác cũng có thể. Tôi đang cố gắng sử dụng EF 6 để gọi một thủ tục được lưu trữ, nhưng đã gặp lỗi tương tự vì thủ tục được lưu trữ có một máy chủ được liên kết đang được sử dụng.

Không thể thực hiện thao tác vì nhà cung cấp OLE DB _ cho máy chủ được liên kết _ không thể bắt đầu giao dịch phân tán

Người quản lý giao dịch đối tác đã vô hiệu hóa hỗ trợ của nó cho các giao dịch từ xa / mạng *

Chuyển sang SQL Client đã khắc phục sự cố của tôi, điều này cũng xác nhận với tôi rằng đó là một thứ EF.

Cố gắng dựa trên phương pháp tạo mô hình EF:

db.SomeStoredProcedure();

Nỗ lực dựa trên ExecuteSqlCommand:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

Với:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

Mã đó có thể được rút ngắn, nhưng tôi nghĩ rằng phiên bản đó thuận tiện hơn một chút cho việc gỡ lỗi và chuyển qua.

Tôi không tin rằng Sql Client nhất thiết phải là một lựa chọn ưu tiên, nhưng tôi cảm thấy điều này ít nhất cũng đáng được chia sẻ nếu bất kỳ ai khác gặp vấn đề tương tự được google đưa đến đây.

Code trên là C #, nhưng khái niệm cố gắng chuyển sang Sql Client vẫn được áp dụng. Ít nhất nó sẽ được chẩn đoán để cố gắng làm như vậy.


Hấp dẫn. Tôi nghĩ bạn có thể muốn chỉnh sửa giải pháp bằng mã VB (có sẵn trình dịch mã), vì vậy nó sẽ phù hợp với các thẻ của câu hỏi. Tuy nhiên, tôi vẫn ủng hộ nó.
Lajos Arpad

1

Nếu bạn không thể tìm thấy Local DTC trong các dịch vụ thành phần, hãy thử chạy tập lệnh PowerShell này trước:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

Và nó xuất hiện!

Nguồn: Người quản lý giao dịch đối tác đã vô hiệu hóa hỗ trợ giao dịch từ xa / mạng


0

Trong trường hợp những người khác có cùng vấn đề:

Tôi đã có một lỗi tương tự xảy ra. hóa ra tôi đang gói một số câu lệnh SQL trong một giao dịch, nơi một trong số chúng được thực thi trên một máy chủ được liên kết (Câu lệnh hợp nhất trong một câu lệnh EXEC (...) AT Server). Tôi đã giải quyết sự cố bằng cách mở một kết nối riêng biệt với máy chủ được liên kết, đóng gói câu lệnh đó trong một thử ... bắt rồi hủy giao dịch trên kết nối ban đầu trong trường hợp bắt lỗi.


0

Tôi đã có cùng một thông báo lỗi. Đối với tôi, việc thay đổi pooling=Falsethành ;pooling=true;Max Pool Size=200trong chuỗi kết nối đã khắc phục sự cố.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.