트랜잭션 에러 발생 원인이 뭘까요..?

안녕하세요. Xamarin.Forms로 안드로이드 어플리케이션을 개발중이고 MSSQL로 데이터를 관리하고 있습니다.
AppCenter를 사용하여 오류를 수집하는 중에 이와 같은 에러를 발견해서 여쭙게 되었습니다.

트랜잭션(프로세스 ID 213)이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오. 트랜잭션(프로세스 ID 213)이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오.

아래가 해당 오류가 발생한 부분의 소스코드 이구요

public DataSet INSERT(string queryString)
{
    DataSet ds = new DataSet();

    SqlConnection connection = new SqlConnection(Preferences.Get("CONNECTION_STRING", string.Empty));
    connection.Open();

    try
    {
        _transaction = connection.BeginTransaction();

        SqlDataAdapter adapter = new SqlDataAdapter();
        SqlCommand command = new SqlCommand(queryString, connection, _transaction);

        adapter.SelectCommand = command;
        adapter.Fill(ds);
        adapter.Update(ds);

        _transaction.Commit();
    }
    catch (Exception ex)
    {
        _transaction.Rollback();
        CrashManager.Instance.TrackCrashes(ex);
    }
    finally
    {
        connection.Close();
    }

    return ds;
}

오류를 살펴보면 adapter.Fill(ds)을 하는 부분에서 Exception이 발생해서 catch에 잡혔더라고요. 실제 쿼리 상에서는 트랜잭션을 잡는 부분이 없고, 그렇다면 클라이언트 상에서 문제가 발생했다는 것인데 원인을 찾는데 어려움이 많네요. 도움 혹은 조언 부탁드립니다.

2개의 좋아요

SqlDataAdapter와 SqlCommand, transaction도 finally에 Dispose 해보세요. 이 함수 호출하는 쪽에서도 DataSet.Dispose 해야합니다.

3개의 좋아요

한번 시도해보겠습니다 감사합니다!

1개의 좋아요

BeginTransaction을 했으니 Transaction 오류가 나올 수 있는 것이고,
만일 문제가 된다면 쿼리 실행 과정에서 문제가 생긴게 아닐까요?
어떤걸 쿼리하는지, 그 쿼리에서 문제가 생기는 건 없는지 살펴봐야 할 것 같습니다.

2개의 좋아요

지금 소스에서 한가지 특이한 점은 connection을 using으로 처리하지 않으셨다는 건데,
되도록이면 using문 안에서 모든걸 처리하고 자동으로 close되도록 하는게 좋을 것 같아요.

트랜잭션의 범위가 기본적으로 Connection으로 알고 있는데,
특정 Connection이 open된 상태에서 Transaction이 여러 번 호출된 건 아닌가 의심됩니다.(다른 스레드에 의해서)

3개의 좋아요

아, 그러고보니 _transaction 인스턴스를 전역 변수로 선언해서 쓰고 계신거 같네요…
여기서 문제가 생긴 것 같아보입니다…

2개의 좋아요

아하… 맞네요 왜 그거를 눈치 못채고 있었을까요 ㅠㅠ
참 바보같네요 흙 감사합니다

3개의 좋아요

좀다른얘기지만 proc 를 쓰실것면 dapper 가있고 inline query 는 ef 가있는데 sqldataadapter 같
은 고전전인 방식을 쓰신이유가있을까요?

3개의 좋아요

기존 Windows application이 존재하는 상태에서 Xamarin.Forms로 Android Application만 추가로 제작한 상태여서 다른 방법을 사용해야겠다는 생각을 안 했네요:joy:

게다가 Dapper라는 것은 오늘 처음 들어보고 막 검색을 하게 되었습니다. 새로운 의견 주셔서 감사합니다. 그런데 SqlDataAdapter 같은 방식이 고전적인 방식인가요?

한동안 설비와 실시간 통신 프로그램만 만들다가 DB를 만지기 시작한지 얼마되지 않아 지식이 많이 부족하네여 ㅠㅠ

3개의 좋아요