2017-10-06 4 views
0

사용자가 데이터베이스 테이블과 필드를 만들 수있는 응용 프로그램이 있습니다. SMO (SQL Management Object) (Microsoft.SqlServer.Smo)를 사용하여 테이블을 변경합니다.현재 연결과 관련된 트랜잭션이 완료되었지만 처리되지 않았습니다. (편집 # 3)

기존의 테이블을 갱신 코드는 다음을 수행 : 테이블 모음에 액세스하려고 시도 라인에서

using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, new TimeSpan(0, 15, 0))) 
{ 
    using (SqlConnection sqlConnection = new SqlConnection(connectionSettings.ConnectionString)) 
    { 
      ServerConnection serverConnection = new ServerConnection(sqlConnection); 
      SMO.Server server = new SMO.Server(serverConnection); 
      SMO.Database database = server.Databases[sqlConnection.Database]; 
      SMO.Table table = database.Tables[targetTableName]; 

      // perform table operations such as add new columns 
    } 

, 우리는 오류가 나타날 수 이 현재 연결과 관련된 트랜잭션이 완료하지만, 처분되지 않았습니다. SQL 문을 실행하기 위해 연결을 사용하려면 트랜잭션을 처리해야합니다.

이 코드는 우리 환경과 다른 고객 사이트의 30 가지 다른 컴퓨터에서 작동합니다. 그러나 한 고객 사이트에서 코드가이 오류를 생성합니다.

표를 검색하기 위해 호출하기 전에 System.Transactions.Transaction.Current.TransactionInformation.Status를 Active로 표시하는 추적을 추가했습니다. System.Transactions.TransactionManager.MaximumTimeout의 추적은 10 분을 표시합니다.

고객이 두 대의 다른 컴퓨터에서 문제를 복제했습니다. 고객이 이전 버전의 코드를 실행하면 작동합니다.

버전간에 최신 SQL Server 2016 SMO dll을 사용하도록 업데이트했습니다. 그러나 다시 이것은 다른 고객 사이트에서 작동하고 이전 버전의 코드를 사용하고 있습니다.

SMO 관련 DLL을 BIN 디렉토리에 복사해도 문제가 해결되지 않습니다. Nuget에서 최신 SMO 관련 DLL로 업데이트해도 문제가 해결되지 않았습니다.

질문 :
이 오류의 원인을 파악하는 방법에 대한 조언이 있으십니까? 여기에 무엇이 누락되어 있는지 확실하지 않습니다.

편집 : 다음은 스택 추적입니다.

at System.Data.SqlClient.SqlInternalConnectionTds.CheckEnlistedTransactionBinding() 

at System.Data.SqlClient.TdsParser.TdsExecuteSQLBatch(String text, Int32 timeout, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj, Boolean sync, Boolean callerHasConnectionLock) 
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) 
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) 
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) 
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) 
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 
at Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException) 
at Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteWithResults(String sqlCommand) 
at Microsoft.SqlServer.Management.Smo.ExecuteSql.ExecuteWithResults(String query) 
at Microsoft.SqlServer.Management.Smo.ExecuteSql.Execute(StringCollection query) 
at Microsoft.SqlServer.Management.Smo.ExecuteSql.ExecuteWithResults(String query, Object con) 
at Microsoft.SqlServer.Management.Smo.PostProcessDatabaseInsideAttribs.InitializeRowCollection(DataProvider dp) 
at Microsoft.SqlServer.Management.Smo.PostProcessDatabaseInsideAttribs.GetColumnData(String name, Object data, DataProvider dp) 
at Microsoft.SqlServer.Management.Smo.DataProvider.ManipulateRowDataPostProcess() 
at Microsoft.SqlServer.Management.Smo.DataProvider.GetTable() 
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(ResultType resultType, StringCollection sql, Object connectionInfo, StatementBuilder sb) 
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(SqlEnumResult sqlresult, ResultType resultType) 
at Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(EnumResult result) 
at Microsoft.SqlServer.Management.Smo.DatabaseLevel.GetData(EnumResult res) 
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData() 
at Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData(Request req, Object ci) 
at Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(Object connectionInfo, Request request) 
at Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(Request req) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetInitDataReader(String[] fields, OrderBy[] orderby) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue) 
at Microsoft.SqlServer.Management.Smo.PropertyCollection.RetrieveProperty(Int32 index, Boolean useDefaultOnMissingValue) 
at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetPropertyObject(Int32 index) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetPropertyOptional(String propName) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.GetDbComparer(Boolean inServer) 
at Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitializeStringComparer() 
at Microsoft.SqlServer.Management.Smo.AbstractCollectionBase.get_StringComparer() 
at Microsoft.SqlServer.Management.Smo.SchemaCollectionBase.InitInnerCollection() 
at Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetObjectByKey(ObjectKeyBase key) 
at Microsoft.SqlServer.Management.Smo.TableCollection.get_Item(String name) 
at UpdateForm(FormInfo updatedForm) 

편집 : 테스트 애플 리케이션 나는 또한 몇 가지 테스트 환경에서 작동하지만, 고객의 컴퓨터에 실패 테스트 응용 프로그램을 만들었습니다

재현. 여기

using Microsoft.SqlServer.Management.Common; 
using System; 
using System.Data.SqlClient; 
using System.Reflection; 
using System.Transactions; 
using SMO = Microsoft.SqlServer.Management.Smo; 

namespace TestSMO 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine($"{"-".PadLeft(25, '-')}"); 
      Console.WriteLine("Test Start"); 

      string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["DEFAULT"].ConnectionString; 

      TraceTransactionStatus(); 

      TimeSpan timeSpanOption = new System.TimeSpan(0, 15, 0); 

      TransactionOptions options = new TransactionOptions(); 
      options.IsolationLevel = IsolationLevel.ReadCommitted; 
      options.Timeout = timeSpanOption; 

      Console.WriteLine(" Start Transaction"); 
      using (System.Transactions.TransactionScope ts = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, options)) 
      { 
       TraceTransactionStatus(); 

       Console.WriteLine(" Using SQL Connection"); 
       using (SqlConnection sqlConnection = new SqlConnection(connectionString)) 
       { 
        try 
        { 
         TraceTransactionStatus(); 

         Console.WriteLine(" New SQL Connection"); 
         ServerConnection serverConnection = new ServerConnection(sqlConnection); 
         Console.WriteLine(" New SQL Connection...done"); 

         TraceTransactionStatus(); 

         Console.WriteLine(" New SMO Server"); 
         SMO.Server server = new SMO.Server(serverConnection); 
         Console.WriteLine(" New SMO Server...done"); 

         TraceTransactionStatus(); 

         Console.WriteLine(" Access database"); 
         SMO.Database database = server.Databases[sqlConnection.Database]; 
         Console.WriteLine(" Access database...done"); 

         TraceTransactionStatus(); 

         Console.WriteLine(" Access document table"); 
         SMO.Table table = database.Tables["Document"]; 
         Console.WriteLine(" Access document table...done"); 

         TraceTransactionStatus(); 
        } 
        catch(Exception e) 
        { 
         Console.WriteLine($"{"*".PadLeft(25, '*')}"); 
         Console.WriteLine($"Exception: {e.Message}"); 
         Console.WriteLine($"{"*".PadLeft(25, '*')}"); 

         TraceTransactionStatus(); 
        } 
       } 

       GetAssemblies(); 
      } 

      Console.WriteLine("Test Complete"); 
      Console.WriteLine($"{"-".PadLeft(25, '-')}"); 

      Console.WriteLine("Press enter to continue"); 
      Console.ReadKey(); 
     } 

     private static void TraceTransactionStatus() 
     { 
      if (System.Transactions.Transaction.Current != null) 
      { 
       Console.WriteLine($"  Current Transaction Status: {Enum.GetName(typeof(System.Transactions.TransactionStatus), System.Transactions.Transaction.Current.TransactionInformation.Status)}"); 
       Console.WriteLine($"  Current Transaction Distributed ID: {System.Transactions.Transaction.Current.TransactionInformation.DistributedIdentifier}"); 
       Console.WriteLine($"  Current Transaction Local ID: {System.Transactions.Transaction.Current.TransactionInformation.LocalIdentifier}"); 
      } 
      else 
      { 
       Console.WriteLine($"  Current Transaction Status: None"); 
      } 
     } 

     public static void GetAssemblies() 
     { 
      Assembly[] asms = AppDomain.CurrentDomain.GetAssemblies(); 
      foreach(Assembly assembly in asms) 
      { 
       Console.WriteLine($"{"-".PadLeft(25, '-')}"); 
       Console.WriteLine($"Fullname: {assembly.FullName}"); 
       Console.WriteLine($"CodeBase: {assembly.CodeBase}"); 
       Console.WriteLine($"ImageRTV: {assembly.ImageRuntimeVersion}"); 
       Console.WriteLine($"Location: {assembly.Location}"); 
      } 
     } 
    } 
} 

는 출력 :

------------------------- 
Test Start 
     Current Transaction Status: None 
    Start Transaction 
     Current Transaction Status: Active 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
    Using SQL Connection 
     Current Transaction Status: Active 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
    New SQL Connection 
    New SQL Connection...done 
     Current Transaction Status: Active 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
    New SMO Server 
    New SMO Server...done 
     Current Transaction Status: Active 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
    Access database 
    Access database...done 
     Current Transaction Status: Active 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
    Access document table 
************************* 
Exception: The transaction associated with the current connection has completed 
but has not been disposed. The transaction must be disposed before the connecti 
on can be used to execute SQL statements. 
************************* 
     Current Transaction Status: Aborted 
     Current Transaction Distributed ID: 00000000-0000-0000-0000-000000000000 
     Current Transaction Local ID: 7377e927-d977-414e-b0ca-69368bb27f58:1 
------------------------- 
Fullname: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll 
------------------------- 
Fullname: TestSMO, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
CodeBase: file:///E:/testAppDir/TestApp/TestApp/TestSMO.exe 
ImageRTV: v4.0.30319 
Location: E:\testAppDir\TestApp\TestApp\TestSMO.exe 
------------------------- 
Fullname: System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll 
------------------------- 
Fullname: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll 
------------------------- 
Fullname: System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll 
------------------------- 
Fullname: System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll 
------------------------- 
Fullname: System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll 
------------------------- 
Fullname: Microsoft.SqlServer.ConnectionInfo, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.ConnectionInfo/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.ConnectionInfo.dll 
ImageRTV: v2.0.50727 
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.ConnectionInfo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.ConnectionInfo.dll 
------------------------- 
Fullname: Microsoft.SqlServer.Smo, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.Smo/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.Smo.dll 
ImageRTV: v2.0.50727 
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Smo\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Smo.dll 
------------------------- 
Fullname: Microsoft.SqlServer.Management.Sdk.Sfc, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.Management.Sdk.Sfc/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.Management.Sdk.Sfc.dll 
ImageRTV: v2.0.50727 
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Management.Sdk.Sfc\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Management.Sdk.Sfc.dll 
------------------------- 
Fullname: Microsoft.SqlServer.SqlEnum, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.SqlEnum/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.SqlEnum.dll 
ImageRTV: v2.0.50727 
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.SqlEnum\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlEnum.dll 
------------------------- 
Fullname: System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll 
------------------------- 
Fullname: System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_32\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll 
------------------------- 
Fullname: Microsoft.SqlServer.SqlClrProvider, Version=13.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 
CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Microsoft.SqlServer.SqlClrProvider/13.0.0.0__89845dcd8080cc91/Microsoft.SqlServer.SqlClrProvider.dll 
ImageRTV: v2.0.50727 
Location: C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.SqlClrProvider\13.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.SqlClrProvider.dll 
------------------------- 
Fullname: System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll 
ImageRTV: v4.0.30319 
Location: C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll 
Test Complete 
------------------------- 
Press enter to continue 

편집 :

우리는 테스트 응용 프로그램의 세 가지 버전을 만들어 더 많은 연구. 각각 다른 버전의 SQL 관리 개체 DLL 인 v12, v13 및 v14에 대해 컴파일됩니다.

v12가 예상대로 작동합니다. v13에서 제목에 예외가 발생합니다. v14가 다른 예외를 throw합니다. 속성 'DatabaseName'에 DefaultSchema 속성을 사용할 수 없습니다. 이 개체에 대해이 속성이 없거나 충분한 액세스 권한으로 인해 검색 할 수 없습니다.

사용자가 Windows 인증을 사용하여 인증하고 있습니다.

사용자가 SQL Server에 있고 데이터베이스와 연결되어 있습니다. [dbo]와 같은 기본 스키마가 있습니다.

사용자는 SQL Server에 있고 해당 데이터베이스와 연결된 도메인 그룹에도 속합니다. 도메인 그룹의 기본 스키마는 [dbo]입니다.

단서인지 "붉은 청어"인지 확실하지 않습니다.

+0

전체 사용 내역을 표시 할 수 있습니까? – AGrammerPro

+0

당신이 무엇을 요구하고 있는지 확실하지 않습니다. 줄에 오류가 발생했습니다 : SMO.Table table = database.Tables [targetTableName]; 사용하는 진술 그 자체는 게시물에서 볼 수있는 것입니다. 오류가 발생하지 않는 줄 아래의 코드 – Sdev

+0

테스트 app 및 출력을 추가하십시오. – Sdev

답변

0

우리의 문제에 대한 해결책 (해결 방법)은 클라이언트 컴퓨터와 SQL Server 컴퓨터 모두에서 MSDTC (Microsoft Distributed Transaction Coordinator)를 구성하는 것이 었습니다.

  1. Distribute Transaction Coordinator가 서비스에서 실행 중인지 확인하십시오.
  2. 각 컴퓨터에서 구성 요소 서비스를 엽니 다. 내 컴퓨터, Distribute Transaction Coordinator, 로컬 DTC를 확장합니다. 마우스 오른쪽 버튼을 클릭하고 속성보기를 클릭하십시오. 보안 탭에서 다음을 수행합니다. 네트워크 DTC 사용, 원격 클라이언트 허용, 모든 인바운드, 모든 아웃 바운드 및 인증 방법 선택.

우리의 추측은 트랜잭션을 분산 트랜잭션으로 향상시킨 Microsoft.SQLServer.SMO 버전 12와 Microsoft.SQLServer.SMO 버전 13 및 14 사이에서 변경되었습니다. 버전 12에서는 MSDTC가 필요하지 않았습니다.

참고 : 트랜잭션을 사용하지 않거나 억제 옵션과 함께 트랜잭션 범위를 사용하면 코드도 실패하지 않습니다.

관련 문제