Tidak dapat memulai transaksi terdistribusi


95

Saya mencoba menjalankan SQL terhadap server yang ditautkan, tetapi saya mendapatkan kesalahan di bawah ini:

BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions


OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".

Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.

Ada dua kesalahan yang dikembalikan oleh penyedia:

Kesalahan # 1:

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile: 
HelpContext: $00000000
SQLState: 01000
NativeError: 7412

Kesalahan # 2

Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile: 
HelpContext: $00000000
SQLState: 42000
NativeError: 7391

Bagaimana cara agar Microsoft lebih mengutamakan fungsionalitas daripada keamanan?

Atau, setidaknya, bagaimana saya bisa mendapatkan dua SQL Sever untuk berbicara satu sama lain?

Pertanyaan-pertanyaan Terkait


Apa yang telah saya lakukan tidak relevan, tetapi saya akan tetap mempostingnya.

  1. Pastikan Distributed Transaction Coordinatorlayanan berjalan di kedua mesin:

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

  2. Nonaktifkan semua keamanan MSDTC di kedua mesin:

    masukkan deskripsi gambar di sini

    masukkan deskripsi gambar di sini

  3. Aktifkan opsi acak di server tertaut:

masukkan deskripsi gambar di sini

  1. Terkutuk dan bersumpah.

  2. Hal-hal yang hancur.

  3. Memeriksa bahwa a SELECTdapat menggunakan server tertaut :

        SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
        ....
    
        (763 row(s) affected)
  4. Memeriksa bahwa server klien dapat pingserver jarak jauh :

         C:\Documents and Settings\avatar>ping asicmstest.contoso.com
    
         Pinging asicmstest.contoso.com [10.0.0.40] with 32 bytes of data:
    
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.40: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.40:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  5. Memeriksa apakah server jarak jauh dapat berkomunikasi kembali, dengan nama, ke server yang memulai:

         C:\Documents and Settings\avatar>ping asitestserver.contoso.com
    
         Pinging asitestserver.contoso.com [10.0.0.22] with 32 bytes of data:
    
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
         Reply from 10.0.0.22: bytes=32 time<1ms TTL=128
    
         Ping statistics for 10.0.0.22:
             Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
         Approximate round trip times in milli-seconds:
             Minimum = 0ms, Maximum = 0ms, Average = 0ms
  6. Dicentang yang @@SERVERNAMEcocok dengan nama server di kedua server :

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       -------------  -------------
       ASITESTSERVER  ASITESTSERVER

    dan

       SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
    
       ----------  ----------
       ASIGROBTEST  ASIGROBTEST
  7. Berteriak

  8. Dikeluarkan SET XACT_ABORT ONsebelum mengeluarkan pertanyaan saya :

    SET XACT_ABORT ON
    GO
    BEGIN DISTRIBUTED TRANSACTION
    SELECT TOP 1 * FROM Sessions
  9. Diberikan Everyone Full Controlkepada :

    HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer

    di kedua server.


30
senang melihat Anda tidak melewatkan langkah penting "terkutuk dan bersumpah"!
jwl

11
@joelarson Hai, terkadang orang sangat memperhatikan Anda mengikuti setiap langkah. Saya tidak ingin ada yang mengatakan bahwa saya tidak mencoba sesuatu.
Ian Boyd

5
Saya suka posting ini. Itu menggambarkan setiap pengalaman yang pernah saya alami dengan MSDTC.
A. Murray

5
Dalam kasus saya, setelah saya menetapkan "Aktifkan Promosi Transaksi Terdistribusi untuk RPC" ke False di server tertaut, ini berfungsi. Mungkin mencobanya
Sarsaparilla

3
@HaiPhan Mematikan penggunaan transaksi terdistribusi merusak integritas transnasional: jika Anda mengembalikan perubahan Anda di server lokal berarti bahwa perubahan akan tetap berlaku di server jarak jauh. Sangat berbahaya.
Ian Boyd

Jawaban:


31

Menemukannya, MSDTC di server jauh adalah tiruan dari server lokal.

Dari Log Peristiwa Aplikasi Windows:

Jenis Peristiwa: Kesalahan
Sumber Peristiwa:
Kategori Peristiwa MSDTC :
ID Peristiwa CM : 4101
Tanggal: 9/19/2011
Waktu: 1:32:59 PM
Pengguna: N / A
Komputer: ASITESTSERVER
Deskripsi:

MS DTC lokal mendeteksi bahwa MS DTC di ASICMSTEST memiliki identitas unik yang sama dengan MS DTC lokal. Artinya kedua MS DTC tersebut tidak akan bisa saling berkomunikasi. Masalah ini biasanya terjadi jika salah satu sistem diklon menggunakan alat kloning yang tidak didukung. MS DTC mengharuskan sistem diklon menggunakan alat kloning yang didukung seperti SYSPREP. Menjalankan 'msdtc -uninstall' dan kemudian 'msdtc -install' dari prompt perintah akan memperbaiki masalah. Catatan: Menjalankan 'msdtc -uninstall' akan mengakibatkan sistem kehilangan semua informasi konfigurasi MS DTC.

Untuk informasi lebih lanjut, lihat Pusat Bantuan dan Dukungan di http://go.microsoft.com/fwlink/events.asp .

Lari

msdtc -uninstall
msdtc -install

dan kemudian menghentikan dan memulai ulang layanan SQL Server memperbaikinya.


2
Mari kita lihat apakah saya melakukannya dengan benar: 1- msdtc -uninstall 2- msdtc -install 3- restart layanan SQL Server 4- restart layanan SQL Agent, hanya untuk memastikan 5- bahkan restart layanan "Distributed Transaction Coordinator" ... Saya telah melakukan semua ini di kedua mesin (server utama & server terkait) a ~ dan tidak ada, masih kesalahan yang sama!
Hamid Sadeghian

9

Saya dapat menyelesaikan masalah ini (seperti yang disebutkan orang lain dalam komentar) dengan menonaktifkan "Aktifkan Promosi Transaksi Terdistribusi untuk RPC" (yaitu, menyetelnya ke False):

masukkan deskripsi gambar di sini


1
Ini berhasil untuk saya. Yang aneh adalah sudah baik-baik saja selama berminggu-minggu, dan kemudian tiba-tiba dimulai. Mungkin karena layanan DTC server jarak jauh mungkin dinonaktifkan. Terima kasih.
Boyd P

6

Oke, jadi layanan dimulai, ada jalur ethernet di antara mereka, resolusi nama berfungsi, server tertaut berfungsi, dan Anda menonaktifkan otentikasi transaksi.

Perasaan saya mengatakan masalah firewall, tetapi beberapa hal muncul di pikiran ...

  1. Apakah mesin berada dalam domain yang sama? (ya, tidak masalah dengan otentikasi yang dinonaktifkan)
  2. Apakah firewall berjalan di mesin? DTC bisa menjadi sedikit merepotkan untuk firewall karena menggunakan berbagai port, lihat http://support.microsoft.com/kb/306843 Untuk saat ini, saya akan menonaktifkan firewall demi mengidentifikasi masalah
  3. Apa kata ping DTC? http://www.microsoft.com/download/en/details.aspx?id=2868
  4. Akun apa yang menjalankan Layanan SQL?

2

Jika server berkerumun dan ada DTC berkerumun, Anda harus menonaktifkan keamanan di DTC berkerumun, bukan DTC lokal.


1

Jika server Tujuan Anda berada di cloud atau pusat data lain, maka perlu menambahkan entri host layanan MSDTC (Server Tujuan) di server sumber Anda.

Coba yang ini jika masalah tidak teratasi, Setelah mengaktifkan pengaturan MSDTC.


1

Bagi saya, ini terkait dengan pengaturan Firewall. Pergi ke pengaturan firewall Anda, izinkan DTC Service dan itu berhasil.masukkan deskripsi gambar di sini


0

Petualangan terakhir saya dengan MSDTC dan kesalahan hari ini ternyata adalah masalah DNS. Anda berada di jalur yang benar menanyakan apakah mesin berada di domain yang sama, EBarr. Ngomong-ngomong, daftar hebat untuk masalah ini!

Situasi saya: Saya memerlukan server di domain anak untuk dapat menjalankan transaksi terdistribusi terhadap server di domain induk melalui firewall. Saya telah menggunakan server tertaut cukup banyak selama bertahun-tahun, jadi saya memiliki semua pengaturan biasa dalam SQL untuk server tertaut dan di MSDTC yang didokumentasikan Ian dengan sangat baik di atas. Saya menyiapkan MSDTC dengan berbagai port TCP (5000-5200) untuk digunakan di kedua server, dan mengatur lubang firewall di antara kotak untuk port 1433 dan 5000-5200. Itu seharusnya berhasil. Server tertaut diuji OK dan saya dapat menanyakan server SQL jarak jauh melalui server tertaut dengan baik, tetapi saya tidak bisa mendapatkannya untuk memungkinkan transaksi terdistribusi. Saya bahkan bisa melihat koneksi di server QA dari server DEV, tetapi ada sesuatu yang tidak membuat perjalanan kembali.

Saya bisa PING server DEV dari QA menggunakan FQDN seperti: PING DEVSQL.dev.domain.com

Saya tidak bisa PING server DEV hanya dengan nama mesin: PING DEVSQL

Server DEVSQL seharusnya menjadi anggota dari kedua domain, tetapi namanya tidak diselesaikan di DNS domain induk ... sesuatu telah terjadi pada akun mesin untuk DEVSQL di domain induk. Setelah kami menambahkan DEVSQL ke DNS untuk domain induk, dan "PING DEVSQL" berfungsi dari server QA jarak jauh, masalah ini telah teratasi bagi kami.

Saya harap ini membantu!



0

Saya mendapatkan kesalahan yang sama dan saya berhasil mengatasinya dengan mengkonfigurasi MSDTC dengan benar di server sumber untuk memungkinkan keluar dan mengizinkan DTC melalui firewall windows.

Izinkan Koordinator Transaksi Terdistribusi, centang domain, opsi privat dan publik

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.