2010-04-12 1 views
16

우리는 서버 # 1에 웹 서비스를 가지고 있고 서버 # 2에 데이터베이스를 가지고 있습니다. 웹 서비스는 트랜잭션 범위를 사용하여 분산 트랜잭션을 생성합니다. 모든 것이 정확합니다.예외 "트랜잭션 상태에 대한 연산이 유효하지 않습니다"TransactionScope를 사용하여

그리고 서버 # 3에 다른 데이터베이스가 있습니다. 우리는이 서버에 몇 가지 문제가 있었고 운영 체제와 소프트웨어를 다시 설치했습니다. MSDTC를 구성하고 서버 # 1의 웹 서비스를 사용하여이 서버의 데이터베이스와 통신하려고했습니다. 그리고 이제 트랜잭션 범위 내의 첫 번째 select 문 다음에 우리는 The operation is not valid for the state of the transaction을 얻습니다. 이 예외는 트랜잭션 범위를 사용하는 경우 모든 웹 서비스 요청에 포함됩니다. 서버 # 2와 서버 # 3은 거의 비슷합니다. 차이는 설정에만있을 수 있습니다. .NET Framework 3.5 SP1이 설치되어 있고 모든 서버에 SQL Server SP3이 설치되어 있습니다.

전체 스택 트레이스 :

System.Transactions.TransactionState.EnlistPromotableSinglePhase (InternalTransaction 텍사스, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, 트랜잭션 atomicTransaction) 을 в System.Transactions.Transaction.EnlistPromotableSinglePhase (IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull (트랜잭션 ) System.Data.SqlClient.SqlInte rnalConnection.Enlist (트랜잭션 t의 в System.Data.ProviderBase.DbConnectionPool.GetConnection в System.Data.SqlClient.SqlInternalConnectionTds.Activate System.Data.ProviderBase.DbConnectionInternal.ActivateConnection (거래 거래 в (거래 거래)() System.Data.SqlClient.SqlConnection.Open в DbConnection owningObject) в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection outerConnection, DbConnectionFactory ConnectionFactory에)() 012 NHibernate.Connection.DriverConnectionProvid NHibernate.Impl.SessionFactoryImpl.OpenConnection()

в er.GetConnection는() 나는이 메시지를 검색하지만 적절한 해결책을 발견하지 않았다. 그러면 어떤 설정을 확인해야하며 정확히 해결해야합니까?

+0

어떤 OS 및 방법을 정확하게 당신이 MSDTC를 구성 했습니까? –

+0

어떤 형태의 TransactionScope() 생성자를 사용하고 있습니까? – gprasant

+0

안녕 Lanfear, 이 문제를 해결하셨습니까? 테스트 환경에서 동일한 오류가 발생합니다. Dev 환경에서 동일한 코드가 정상적으로 작동합니다. –

답변

30

Lanfear, 나는 동일한 오류 메시지를 보았고 해결책을 찾았습니다. 귀하의 상황은 다를 수 있지만 다음 지식이 귀하에게 유용하기를 바랍니다.

System.Transactions.Transaction.Current.TransactionInformation.Status은 현재 트랜잭션의 상태를 반환합니다.

메시지가 The operation is not valid for the state of the transaction 인 예외가 발생하는 경우 디버거를 단계별로 실행하면 예외가 throw되기 전에 상태가 "중단됨"으로 표시됩니다.

필자의 경우이 문제는 두 트랜잭션을 서로 중첩하여 중 단 하나만 중단하려는 경우 실수로 둘 다 중단함으로써 발생합니다. 분명히 TransactionScope 기본 생성자 New TransactionScope()을 두 개의 중첩 된 트랜잭션과 함께 사용하면 내부 트랜잭션을 중단하면 외부 트랜잭션도 중단됩니다.해결 방법은 생성자 New TransactionScope(TransactionScopeOption.RequiresNew)을 사용하는 것입니다.이 생성자를 사용하면 내부 트랜잭션이 새 트랜잭션이되고 외부 트랜잭션을 중단하지 않습니다.

내 문제가 해결되었습니다.

+3

System.Transactions.Transaction.Current.TransactionInformation.Status는 트랜잭션이 중단 된시기를 정확하게 나타낼 수있게 도와줍니다. –

5

Distributed Transaction Coordinator를 사용하면 나에게 문제가 해결되었습니다 (웹 서비스가있는 컴퓨터와 데이터베이스가있는 컴퓨터). 웹 서비스에 필요한 경우 확실하지 않습니다.

은 내가 DTC를 활성화하고 Windows 방화벽에 예외를 추가하려면 여기에 설명 된 단계를 수행 : Enable Network DTC Access for Windows Server 2008

관련 문제