중첩 트랜잭션 삽입 실패

ado.net c# dapper sql-server transactions

문제

C #에서 IDBConecction 인터페이스를 사용하여 중첩 트랜잭션을 사용하고 있습니다. 2 개의 다른 테이블에 데이터를 삽입하는 메서드가 있어야하지만 두 번째 삽입에 대해서는 첫 번째 삽입 트랜잭션이 시간 초과 예외를 발생시키는 두 번째 삽입 트랜잭션을 잠급니다.

public void FirstInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //1st insert
                SecondInsert() //calling second insert method
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

public void SecondInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //2nd insert, this one fails
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

SqlServer에서 fisrt insert에 SPID 56이 있는지 확인한 다음 두 번째 삽입을 SPID 57에서 수행 할 때 사용합니다.

exec sp_who2

SPID 57의 "BlkBy"열에는 SPID 56에 의해 차단 된 것으로 표시되어 있습니다.

어떻게 이러한 문제를 극복 할 수 있습니까?

인기 답변

두 작업에 하나의 연결을 사용하십시오. 이것은 연결 개체를 주변에 전달하는 것과 관련이 있습니다.

일반적으로 요청 당 연결 + 트랜잭션 패턴은이 문제를 잘 해결합니다. 모든 종류의 메소드에서 연결을 열면 코드 냄새가 난다. 인프라가이를 처리하지 못한다는 것을 알 수 있습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow