Manajer transaksi telah menonaktifkan dukungannya untuk transaksi jarak jauh / jaringan

86

Saya menggunakan SQL Server dan ASP.NET. Saya memiliki fungsi berikut:

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

Namun, pengecualian ' Manajer transaksi telah menonaktifkan dukungannya untuk transaksi jarak jauh / jaringan. 'dilempar.

Deskripsi JoinScope:

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

Saya telah bekerja dengan cara ini di aplikasi lain dengan lingkungan yang sama tanpa masalah, tetapi di sini saya memiliki masalah ini. Apa yang dapat saya lakukan untuk memperbaiki masalah tersebut?

Lajos Arpad
sumber
Saya melakukan langkah-langkah yang disarankan Magnus terlebih dahulu untuk memastikan bahwa saya memiliki semua basis yang tercakup, sehingga untuk berbicara, dan kemudian berhasil mendapatkan kesalahan yang menyarankan set saya mengaktifkan clr di SQL Server, dan itu berhasil untuk saya. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Jawaban:

141

Pastikan bahwa Layanan "Koordinator Transaksi Terdistribusi" berjalan di database dan klien. Pastikan juga Anda mencentang "Akses DTC Jaringan", "Izinkan Klien Jarak Jauh", "Izinkan Masuk / Keluar", dan "Aktifkan KIAT".

Untuk mengaktifkan Akses DTC Jaringan untuk transaksi MS DTC

  1. Buka snap-in Layanan Komponen.

    Untuk membuka Layanan Komponen, klik Mulai. Di kotak pencarian, ketik dcomcnfg, lalu tekan ENTER.

  2. Perluas pohon konsol untuk menemukan DTC (misalnya, DTC Lokal) yang ingin Anda aktifkan Akses MS DTC Jaringan.

  3. Pada menu Action, klik Properties.

  4. Klik tab Keamanan dan lakukan perubahan berikut: Di Pengaturan Keamanan, pilih kotak centang Akses DTC Jaringan.

    Di Komunikasi Manajer Transaksi, pilih kotak centang Izinkan Masuk dan Izinkan Keluar.

Magnus
sumber
3
Terima kasih, Magnus. Ini harus berupa pengaturan aplikasi, karena jenis transaksi ini bekerja dengan komputer yang sama, yang berarti masalah ini tidak terkait dengan mesin.
Lajos Arpad
Ya saya lakukan. Ini membuat pengecualian yang sama.
Lajos Arpad
Saya rasa itu ada hubungannya dengan apa yang sebenarnya Anda lakukan di dalam TransactionScope.
Magnus
Juga, saya memerlukan cakupan gabungan, karena saya ingin transaksi ini dikirim sebagai permintaan tunggal ke server database.
Lajos Arpad
13
pastikan Anda menggunakan koneksi terbuka yang sama untuk semua panggilan database di dalam transaksi.
Magnus
11

Saya mengalami masalah ini sesekali, saya telah mengikuti instruksi di sini dan yang sangat mirip di tempat lain. Semua telah dikonfigurasi dengan benar.

Halaman ini: http://sysadminwebsite.wordpress.com/2012/05/29/9/ membantu saya menemukan masalah.

Pada dasarnya saya memiliki CID duplikat untuk MSDTC di kedua server. HKEY_CLASSES_ROOT \ CID

Lihat: http://msdn.microsoft.com/en-us/library/aa561924.aspx bagian Pastikan bahwa MSDTC diberi nilai CID yang unik

Saya bekerja dengan server virtual dan tim server kami suka menggunakan gambar yang sama untuk setiap server. Ini perbaikan sederhana dan kami tidak perlu memulai ulang. Tetapi layanan DTC memang membutuhkan pengaturan ke Startup otomatis dan perlu dimulai setelah menginstal ulang.

Rubah
sumber
9

Saya memiliki prosedur penyimpanan yang memanggil Prosedur penyimpanan lain di "server tertaut". Ketika saya menjalankannya dalam ssms tidak apa-apa, tetapi ketika saya memanggilnya dalam aplikasi (Dengan Kerangka Kerja Entitas), saya mendapat kesalahan ini. Artikel ini membantu saya dan saya menggunakan skrip ini:

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

untuk lebih detailnya lihat ini: Server yang ditautkan: Manajer transaksi mitra telah menonaktifkan dukungannya untuk transaksi jarak jauh / jaringan

Amirhossein Yari
sumber
1
Tautan ke solusi diperbolehkan, tetapi harap pastikan jawaban Anda berguna tanpanya: tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan tahu apa itu dan mengapa itu ada, kemudian kutip bagian paling relevan dari halaman Anda ' menautkan ulang jika halaman target tidak tersedia. Jawaban yang tidak lebih dari sebuah tautan dapat dihapus.
Petter Friberg
1
Ini menyelesaikan masalah saya, jadi terima kasih telah memberikan ini. Saya tidak tahu mengapa ia mendapat suara -1, karena itu berhasil memperbaiki masalah spesifik saya.
Boyd P
6

Dalam skenario saya, pengecualian dilemparkan karena saya mencoba membuat instance koneksi baru dalam TransactionScope pada koneksi yang sudah ada:

Contoh:

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.
    }
}
Daniel Minnaar
sumber
3

Komentar dari jawaban : "pastikan Anda menggunakan koneksi terbuka yang sama untuk semua panggilan database di dalam transaksi. - Magnus"

Pengguna kami disimpan dalam db terpisah dari data yang saya gunakan dalam transaksi. Membuka koneksi db untuk mendapatkan pengguna menyebabkan kesalahan ini bagi saya. Memindahkan koneksi db lain dan pencarian pengguna di luar cakupan transaksi memperbaiki kesalahan.

Bakanekobrain
sumber
1

Saya memposting solusi di bawah ini di sini karena setelah beberapa pencarian di sinilah saya mendarat, jadi yang lain mungkin juga. Saya mencoba menggunakan EF 6 untuk memanggil prosedur tersimpan, tetapi mengalami kesalahan serupa karena prosedur tersimpan memiliki server yang ditautkan sedang digunakan.

Operasi tidak dapat dilakukan karena penyedia OLE DB _ untuk server tertaut _ tidak dapat memulai transaksi terdistribusi

Manajer transaksi mitra telah menonaktifkan dukungannya untuk transaksi jarak jauh / jaringan *

Beralih ke SQL Client memang memperbaiki masalah saya, yang juga mengonfirmasi bagi saya bahwa itu adalah masalah EF.

Model EF menghasilkan upaya berbasis metode:

db.SomeStoredProcedure();

Upaya berbasis ExecuteSqlCommand:

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

Dengan:

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();

Kode itu dapat dipersingkat, tetapi menurut saya versi itu sedikit lebih nyaman untuk debugging dan melangkah melalui.

Saya tidak percaya bahwa Klien Sql selalu merupakan pilihan yang disukai, tetapi saya merasa ini setidaknya layak dibagikan jika ada orang lain yang memiliki masalah serupa yang dibawa ke sini oleh google.

Kode di atas adalah C #, tetapi konsep mencoba untuk beralih ke Klien Sql masih berlaku. Setidaknya itu akan mendiagnosis untuk mencoba melakukannya.

Greg
sumber
Menarik. Saya pikir Anda mungkin ingin mengedit solusi dengan kode VB (ada penerjemah kode yang tersedia), jadi itu akan cocok dengan tag pertanyaan. Namun, saya tetap memilihnya.
Lajos Arpad
1

Saya mengalami masalah ini dengan server tertaut di SSMS saat mencoba membuat prosedur tersimpan.

Di server tertaut, saya mengubah opsi server "Aktifkan Promosi pada Transaksi Terdistribusi" menjadi False.

Tangkapan layar Opsi Server

Zack Soderquist
sumber
1

Jika Anda tidak dapat menemukan DTC Lokal di layanan komponen, coba jalankan skrip PowerShell ini terlebih dahulu:

$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

Dan itu muncul!

Sumber: Manajer transaksi mitra telah menonaktifkan dukungannya untuk transaksi jarak jauh / jaringan

Arthur Cam
sumber
0

Jika orang lain memiliki masalah yang sama:

Saya mengalami kesalahan serupa. ternyata saya membungkus beberapa pernyataan SQL dalam sebuah transaksi, di mana salah satunya dieksekusi pada server yang ditautkan (pernyataan Gabung dalam pernyataan EXEC (...) AT Server). Saya menyelesaikan masalah dengan membuka koneksi terpisah ke server yang ditautkan, merangkum pernyataan itu dalam percobaan ... tangkap lalu batalkan transaksi pada koneksi asli jika tangkapannya tersandung.

aggaton
sumber
0

Saya mendapat pesan kesalahan yang sama. Bagi saya mengubah pooling=Falseke ;pooling=true;Max Pool Size=200dalam string koneksi memperbaiki masalah.

Niels Bijl
sumber