source

"작업이 트랜잭션 상태에 대해 유효하지 않습니다." 오류 및 트랜잭션 범위

manysource 2023. 5. 5. 09:53

"작업이 트랜잭션 상태에 대해 유효하지 않습니다." 오류 및 트랜잭션 범위

SELECT 문이 포함된 저장 프로시저를 호출하려고 하면 다음 오류가 발생합니다.

작업이 트랜잭션 상태에 대해 유효하지 않습니다.

다음은 제 통화 구조입니다.

public void MyAddUpdateMethod()
{

    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement

            //do my call to the select statement sp
            bool DoesRecordExist = this.SelectStatementCall(id)
        }
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line
    {
        //create parameters
        //
    }
}

트랜잭션 내에서 동일한 데이터베이스에 대한 다른 연결을 만드는 데 문제가 있습니까?

몇 가지 조사를 해보니 트랜잭션 범위 블록으로 동일한 데이터베이스에 대한 두 개의 연결을 열 수 없는 것 같습니다.코드를 다음과 같이 수정해야 했습니다.

public void MyAddUpdateMethod()
{
    using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        using(SQLServer Sql = new SQLServer(this.m_connstring))
        {
            //do my first add update statement            
        }

        //removed the method call from the first sql server using statement
        bool DoesRecordExist = this.SelectStatementCall(id)
    }
}

public bool SelectStatementCall(System.Guid id)
{
    using(SQLServer Sql = new SQLServer(this.m_connstring))
    {
        //create parameters
    }
}

이 예외가 발생했을 때 InnerException "트랜잭션 시간 초과"가 발생했습니다.디버그 세션 중이었기 때문에 트랜잭션 범위 내에서 코드를 잠시 중지했을 때 이 문제를 무시하기로 결정했습니다.

배포된 코드에 시간 초과가 포함된 이 특정 예외가 나타나면 .config 파일의 다음 섹션이 도움이 될 것입니다.

<system.transactions> 
        <machineSettings maxTimeout="00:05:00" /> 
</system.transactions>

저도 같은 문제에 부딪혔는데, 트랜잭션 제한 시간을 15분으로 변경했는데 작동합니다.이것이 도움이 되길 바랍니다.

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
options.Timeout = new TimeSpan(0, 15, 0);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,options))
{
    sp1();
    sp2();
    ...

}

미래에 이것을 마주치는 모든 방랑자들을 위해.응용 프로그램과 데이터베이스가 서로 다른 컴퓨터에 있고 특히 트랜잭션 범위를 사용할 때 위의 오류가 발생하는 경우 네트워크 DTC 액세스를 사용하도록 설정합니다.이를 위한 단계는 다음과 같습니다.

  1. 컴퓨터가 서로 통신할 수 있도록 방화벽 규칙을 추가합니다.
  2. 분산 트랜잭션 코디네이터 서비스가 실행 중인지 확인합니다.
  3. 네트워크 DTC 액세스를 활성화합니다.dcomcnfg를 실행합니다.Component services > My Computer > Distributed Transaction Coordinator > Local DTC로 이동합니다.마우스 오른쪽 단추로 속성을 클릭합니다.
  4. 그림과 같이 네트워크 DTC 액세스를 활성화하십시오.

중요:DTC 로그온 계정 필드에서 사용자 계정 및 암호를 편집/변경하지 마십시오. 그대로 두면 창이 다시 설치됩니다.

DTC 사진

내 트랜잭션이 다른 트랜잭션에 중첩되어 있을 때 이 오류가 발생했습니다.저장 프로시저가 자체 트랜잭션을 선언하거나 호출 함수가 트랜잭션을 선언할 수 있습니까?

다른 트랜잭션 블록 내에서 예외가 발생한 후 트랜잭션 블록을 롤백하려고 할 때 이 오류가 발생했습니다.

그것을 고치기 위해 해야 할 일은 내부 트랜잭션 블록을 제거하는 것이었습니다.

중첩된 트랜잭션을 사용할 경우 상황이 상당히 복잡해질 수 있습니다. 이 문제를 피하고 코드를 재구성하는 것이 가장 좋습니다.

제 경우 해결책은 "transactions cope"의 시간을 늘리는 것도 아니고 machine.config 파일의 "system.transactions"의 "machineSettings" 속성의 시간을 늘리는 것도 아니었습니다.

이 경우 정보의 양이 매우 많을 때만 오류가 발생했기 때문에 이상한 점이 있었습니다.

따라서 문제는 트랜잭션 내부의 코드에 서로 다른 테이블에 대한 업데이트를 수행하는 "각자별"이 많다는 사실에 기초합니다(다른 직원이 개발한 코드에서 이 문제를 해결해야 했습니다).표에 적은 수의 레코드를 사용하여 테스트를 수행한 경우 오류가 표시되지 않지만 레코드 수가 증가한 경우 오류가 표시됩니다.

결국 솔루션은 단일 트랜잭션에서 여러 개의 개별 트랜잭션으로 변경하는 것이었습니다. 각각의 트랜잭션은 트랜잭션 내에 있었습니다.

두 개의 트랜잭션을 동시에 열 수 없습니다.제가 하는 일은 거래를 지정하는 것입니다.두 번째 트랜잭션에서 사용할 결과를 반환하기 전에 complete()입력합니다.

데이터베이스 프로세스의 일부를 처리하는 독점 타사 라이브러리를 업데이트했는데 저장할 모든 호출에서 이 오류가 발생했습니다.참조된 트랜잭션 범위 메서드가 한 라이브러리에서 다른 라이브러리로 이동했기 때문에 web.config 트랜잭션 키 섹션의 값을 변경해야 했습니다.

이전에 그 키와 관련된 다른 오류가 있었지만, 키를 주석 처리하여 제거했습니다(그 시점에서 의심스러웠어야 했지만, 빛나는 새 라이브러리에 없었기 때문에 중복된 것으로 추정했습니다).

언급URL : https://stackoverflow.com/questions/193154/the-operation-is-not-valid-for-the-state-of-the-transaction-error-and-transact