오류가 발생하면 using 문이 데이터베이스 트랜잭션을 롤백합니까?


83

using 문에 IDbTransaction이 있지만 using 문에서 예외가 발생하면 롤백되는지 확실하지 않습니다. using 문이 Dispose ()의 호출을 강제 할 것이라는 것을 알고 있지만 Rollback ()에 대해서도 동일한 지 아는 사람이 있습니까?

업데이트 : 또한 아래에있는 것처럼 명시 적으로 Commit ()를 호출해야합니까, 아니면 using 문으로 처리 할 것입니까?

내 코드는 다음과 같습니다.

using Microsoft.Practices.EnterpriseLibrary.Data;

...

using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
    connection.Open();

    using(IDbTransaction transaction = connection.BeginTransaction())
    {
       //Attempt to do stuff in the database
       //potentially throw an exception
       transaction.Commit();
    }
}

3
안녕하세요, "커밋"사례를 명확히하기 위해서입니다. using () {}은 Dispose () 메서드를 호출하기 때문에 필수 사항입니다. 이 커밋 또는 폐기해야하는 경우가 :) 또한 자동 있었다 커밋하면 Transaction.Dispose 클래스는 알 수 없었다
Manitra Andriamitondra에게

답변:


104

트랜잭션 클래스에 대한 Dispose 메서드는 롤백을 수행하는 반면 Oracle의 클래스는 수행하지 않습니다. 따라서 트랜잭션의 관점에서 구현에 따라 다릅니다.

using다른 한편으로는 연결 개체에 대한 문 중 하나를 데이터베이스에 연결을 종료하거나 재설정 한 후 풀에 대한 연결을 반환합니다. 두 경우 모두 미결 트랜잭션을 롤백해야합니다. 그렇기 때문에 예외가 활성 트랜잭션을 절대로 남기지 않는 이유입니다.

또한 예, Commit()명시 적으로 호출해야합니다 .


명시 적으로 예외를 throw하여 한 번도 테스트했습니다.
Pawel Krakowiak

1
이다 멋진,하지만 당신은 교차 DB 호환성을 위해 그것을 사용하는 경우는 IDbTransaction의 다른 구현을 위해 작동합니까?
Matt Hamilton

4
@mezoid : 커밋은 자동으로 발생하지 않습니다. @matt : 그들은 설계 상 그렇게해야합니다.
Sedat Kapanoglu

1
@MattHamilton 정확히 ssg가 말한대로. MySQL의 .net 커넥터 소스를 확인했는데 위와 같은 작업도 수행했습니다. Rollback호출되었습니다 Dispose! :)
nawfal 2013

1
을 사용하는 경우 System.Data.OracleConnection폐기시 롤백되지 않습니다. 아니면 적어도 우리에게는 그렇지 않습니다.
Medinoc

20

커밋을 호출해야합니다. using 문은 아무것도 커밋하지 않습니다.


5
예, 사용은 종료시 Dispose를 호출하고 Commit이 아닌 Rollback을 호출합니다.
경외

4

Commit()호출되지 않은 예외가 있으면 트랜잭션이 자동으로 롤백됩니다.


네, 제 이해입니다. 트랜잭션은 커밋이 호출되거나 연결이 종료 될 때까지 유지됩니다. 이 시점에서 트랜잭션 로그는 실제로 변경 사항으로 업데이트되거나 닫힌 연결의 경우 롤백됩니다 (닫힌 연결에서 커밋을 얻지 못할 것입니다;)).
Mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.