ตัวจัดการธุรกรรมได้ปิดใช้งานการสนับสนุนสำหรับธุรกรรมระยะไกล / เครือข่าย


86

ฉันใช้ SQL Server และ ASP.NET ฉันมีฟังก์ชั่นดังต่อไปนี้:

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

อย่างไรก็ตามข้อยกเว้น " ตัวจัดการธุรกรรมได้ปิดใช้งานการสนับสนุนธุรกรรมระยะไกล / เครือข่าย 'ถูกโยน.

คำอธิบายของ JoinScope:

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

ฉันใช้วิธีนี้ในแอปพลิเคชันอื่นที่มีสภาพแวดล้อมเดียวกันโดยไม่มีปัญหา แต่ที่นี่ฉันมีปัญหานี้ ฉันจะแก้ไขปัญหานี้ได้อย่างไร


ฉันทำตามขั้นตอนที่ Magnus แนะนำก่อนเพื่อให้แน่ใจว่าฉันได้ครอบคลุมฐานทั้งหมดแล้วเพื่อที่จะพูดจากนั้นจัดการเพื่อรับข้อผิดพลาดที่แนะนำว่าชุดที่ฉันเปิดใช้งาน clr ใน SQL Server และนั่นก็ใช้ได้สำหรับฉัน msdn.microsoft.com/en-us/library/ms131048.aspx
ลี

คำตอบ:


141

ตรวจสอบให้แน่ใจว่าบริการ "Distributed Transaction Coordinator" กำลังทำงานบนทั้งฐานข้อมูลและไคลเอนต์ ตรวจสอบให้แน่ใจว่าคุณได้เลือก "Network DTC Access", "Allow Remote Client", "Allow Inbound / Outbound" และ "Enable TIP"

เพื่อเปิดใช้งาน Network DTC Access สำหรับธุรกรรม MS DTC

  1. เปิดสแน็ปอินบริการคอมโพเนนต์

    ในการเปิดบริการคอมโพเนนต์คลิกเริ่ม ในกล่องค้นหาพิมพ์ dcomcnfg แล้วกด ENTER

  2. ขยายคอนโซลทรีเพื่อค้นหา DTC (เช่น Local DTC) ที่คุณต้องการเปิดใช้งาน Network MS DTC Access

  3. บนเมนูการดำเนินการคลิกคุณสมบัติ

  4. คลิกแท็บความปลอดภัยและทำการเปลี่ยนแปลงต่อไปนี้: ในการตั้งค่าความปลอดภัยเลือกกล่องกาเครื่องหมายการเข้าถึงเครือข่าย DTC

    ในการสื่อสารตัวจัดการธุรกรรมให้เลือกกล่องกาเครื่องหมายอนุญาตขาเข้าและอนุญาตขาออก


3
ขอบคุณแม็กนัส ต้องเป็นการตั้งค่าของแอปพลิเคชันเนื่องจากธุรกรรมประเภทนี้ทำงานกับคอมพิวเตอร์เครื่องเดียวกันซึ่งหมายความว่าปัญหานี้ไม่เกี่ยวข้องกับเครื่อง
Lajos Arpad

ใช่ฉันทำ. มันพ่นข้อยกเว้นเดียวกัน
Lajos Arpad

ฉันเดาว่ามันเกี่ยวข้องกับสิ่งที่คุณกำลังทำอยู่ใน TransactionScope
Magnus

นอกจากนี้ฉันต้องการขอบเขตการเข้าร่วมเนื่องจากฉันต้องการให้ธุรกรรมนี้ถูกส่งเป็นคำขอเดียวไปยังเซิร์ฟเวอร์ฐานข้อมูล
Lajos Arpad

13
ตรวจสอบให้แน่ใจว่าคุณใช้การเชื่อมต่อแบบเปิดเดียวกันสำหรับการเรียกฐานข้อมูลทั้งหมดภายในธุรกรรม
Magnus

11

ฉันได้รับปัญหานี้เป็นระยะ ๆ ฉันได้ทำตามคำแนะนำที่นี่และสิ่งที่คล้ายกันมากที่อื่น ทั้งหมดได้รับการกำหนดค่าอย่างถูกต้อง

หน้านี้: http://sysadminwebsite.wordpress.com/2012/05/29/9/ช่วยฉันพบปัญหา

โดยทั่วไปฉันมี CID ซ้ำสำหรับ MSDTC ในเซิร์ฟเวอร์ทั้งสอง HKEY_CLASSES_ROOT \ CID

ดู: http://msdn.microsoft.com/en-us/library/aa561924.aspxส่วนตรวจสอบให้แน่ใจว่า MSDTC ได้รับการกำหนดค่า CID เฉพาะ

ฉันทำงานกับเซิร์ฟเวอร์เสมือนและทีมเซิร์ฟเวอร์ของเราชอบใช้ภาพเดียวกันสำหรับทุกเซิร์ฟเวอร์ เป็นการแก้ไขที่ง่ายและเราไม่จำเป็นต้องรีสตาร์ท แต่บริการ DTC ไม่จำเป็นต้องตั้งค่าเป็นเริ่มต้นอัตโนมัติและไม่จำเป็นต้องเริ่มต้นใหม่หลังจากติดตั้งใหม่


9

ฉันมีขั้นตอนการจัดเก็บที่เรียกขั้นตอนการจัดเก็บอื่นใน "เซิร์ฟเวอร์ที่เชื่อมโยง" เมื่อฉันดำเนินการใน ssms มันก็โอเค แต่เมื่อฉันเรียกมันในแอปพลิเคชัน (โดยเอนทิตีเฟรมเวิร์ก) ฉันได้รับข้อผิดพลาดนี้ บทความนี้ช่วยฉันและฉันใช้สคริปต์นี้:

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

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่: เซิร์ฟเวอร์ที่เชื่อมโยง: ตัวจัดการธุรกรรมของพันธมิตรได้ปิดใช้งานการสนับสนุนสำหรับธุรกรรมระยะไกล / เครือข่าย


1
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มีมัน: เพิ่มบริบทรอบ ๆ ลิงก์เพื่อให้ผู้ใช้เพื่อนของคุณมีความคิดว่ามันคืออะไรและทำไมจึงอยู่ที่นั่นจากนั้นอ้างถึงส่วนที่เกี่ยวข้องที่สุดของเพจ การเชื่อมโยงอีกครั้งในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่มากกว่าลิงก์เพียงเล็กน้อยอาจถูกลบ
Petter Friberg

1
วิธีนี้ช่วยแก้ปัญหาของฉันได้ดังนั้นขอขอบคุณที่ให้ข้อมูลนี้ ฉันไม่รู้ว่าทำไมถึงได้รับ -1 โหวตเนื่องจากมันช่วยแก้ไขปัญหาเฉพาะของฉัน
Boyd P

6

ในสถานการณ์ของฉันข้อยกเว้นถูกโยนทิ้งเนื่องจากฉันพยายามสร้างอินสแตนซ์การเชื่อมต่อใหม่ภายใน TransactionScope บนการเชื่อมต่อที่มีอยู่แล้ว:

ตัวอย่าง:

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

ความคิดเห็นจากคำตอบ : "ตรวจสอบให้แน่ใจว่าคุณใช้การเชื่อมต่อแบบเปิดเดียวกันสำหรับการเรียกฐานข้อมูลทั้งหมดในธุรกรรม - Magnus"

ผู้ใช้ของเราจะถูกจัดเก็บไว้ในฐานข้อมูลที่แยกจากข้อมูลที่ฉันใช้ในธุรกรรม การเปิดการเชื่อมต่อ db เพื่อรับผู้ใช้ทำให้เกิดข้อผิดพลาดนี้สำหรับฉัน การย้ายการเชื่อมต่อฐานข้อมูลอื่นและการค้นหาผู้ใช้นอกขอบเขตธุรกรรมจะแก้ไขข้อผิดพลาด


1

ฉันโพสต์วิธีแก้ปัญหาด้านล่างที่นี่เพราะหลังจากการค้นหาบางครั้งนี่คือที่ที่ฉันไปถึงคนอื่น ๆ ก็อาจเช่นกัน ผมพยายามที่จะใช้ EF 6 ที่จะเรียกเก็บขั้นตอน แต่มีข้อผิดพลาดที่คล้ายกันเพราะขั้นตอนการเก็บเพิ่งเซิร์ฟเวอร์ที่เชื่อมโยงถูกนำมาใช้

ไม่สามารถดำเนินการได้เนื่องจากผู้ให้บริการ OLE DB สำหรับเซิร์ฟเวอร์ที่เชื่อมโยง _ ไม่สามารถเริ่มธุรกรรมแบบกระจายได้

ผู้จัดการธุรกรรมของพันธมิตรได้ปิดใช้งานการสนับสนุนธุรกรรมระยะไกล / เครือข่าย *

การข้ามไปที่ไคลเอนต์ SQLช่วยแก้ปัญหาของฉันซึ่งยังยืนยันสำหรับฉันว่ามันเป็นสิ่งที่ EF

ความพยายามตามวิธีการสร้างแบบจำลอง EF:

db.SomeStoredProcedure();

ความพยายามตาม ExecuteSqlCommand:

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

ด้วย:

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

โค้ดนั้นสามารถย่อได้ แต่ฉันคิดว่าเวอร์ชันนั้นสะดวกกว่าเล็กน้อยสำหรับการดีบั๊กและการก้าวผ่าน

ฉันไม่เชื่อว่าไคลเอ็นต์ Sql จำเป็นต้องเป็นตัวเลือกที่ต้องการ แต่ฉันรู้สึกว่าอย่างน้อยก็คุ้มค่าที่จะแบ่งปันหากใครก็ตามที่มีปัญหาคล้าย ๆ กันจะถูกเข้ามาที่นี่โดย Google

รหัสข้างต้นคือ C # แต่แนวคิดของการพยายามเปลี่ยนไปใช้ Sql Client ยังคงมีผลบังคับใช้ อย่างน้อยที่สุดก็จะได้รับการวินิจฉัยเพื่อพยายามทำเช่นนั้น


น่าสนใจ. ฉันคิดว่าคุณอาจต้องการแก้ไขโซลูชันด้วยรหัส VB ​​(มีตัวแปลรหัสให้ใช้งาน) ดังนั้นจึงจะตรงกับแท็กของคำถาม อย่างไรก็ตามฉันโหวตให้คะแนน
Lajos Arpad

1

ฉันประสบปัญหานี้กับเซิร์ฟเวอร์ที่เชื่อมโยงใน SSMS ขณะพยายามสร้างขั้นตอนการจัดเก็บ

บนเซิร์ฟเวอร์ที่เชื่อมโยงฉันเปลี่ยนตัวเลือกเซิร์ฟเวอร์ "เปิดใช้งานการส่งเสริมการขายในธุรกรรมแบบกระจาย" เป็น False

ภาพหน้าจอของตัวเลือกเซิร์ฟเวอร์


1

หากคุณไม่พบ Local DTC ในบริการคอมโพเนนต์ให้ลองเรียกใช้สคริปต์ PowerShell นี้ก่อน:

$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

และปรากฏ!

ที่มา: ผู้จัดการธุรกรรมของพันธมิตรได้ปิดใช้งานการสนับสนุนธุรกรรมระยะไกล / เครือข่าย


0

ในกรณีที่คนอื่นมีปัญหาเดียวกัน:

ฉันมีข้อผิดพลาดที่คล้ายกันเกิดขึ้น ปรากฎว่าฉันกำลังตัดคำสั่ง SQL หลายคำสั่งในธุรกรรมซึ่งหนึ่งในนั้นดำเนินการบนเซิร์ฟเวอร์ที่เชื่อมโยง (คำสั่งผสานในคำสั่ง EXEC (... ) AT Server) ฉันแก้ไขปัญหาโดยการเปิดการเชื่อมต่อแยกต่างหากไปยังเซิร์ฟเวอร์ที่เชื่อมโยงห่อหุ้มคำสั่งนั้นในการลอง ... จับจากนั้นยกเลิกธุรกรรมในการเชื่อมต่อเดิมในกรณีที่การจับสะดุด


0

ฉันมีข้อความแสดงข้อผิดพลาดเดียวกัน สำหรับฉันการเปลี่ยนpooling=Falseเป็น;pooling=true;Max Pool Size=200ในสตริงการเชื่อมต่อช่วยแก้ปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.