2009-04-21 6 views
3

내가 다음을 수행하고 가정 :ADO.NET, 커밋 또는 롤백을하지 않고 OracleConnection 닫기 : 누출됩니까?

using (OracleConnection conn = new OracleConnection(connStr)) 
{ 
    OracleTransaction trans = conn.BeginTransaction(); 
    OracleCommand command = new OracleCommand(cmdTxt, conn, trans); 
    // this statement is executed in a transaction context: 
    command.ExecuteNonQuery(); 
} 
// the using statement will dispose and thus close the connection. 
// a rollback is done implicitly 

내가 transaction.Rollback()를 실행하지 않았지만, 내 테스트는 롤백이 암시 적으로 수행되는 것으로 나타났다.

내 질문은 :이 코드는 연결이 누출 되었습니까?

편집 1 : 나는 System.Data.OracleClient 네임 스페이스입니다.

편집 2 : 이것은 모범 사례 코드입니다. 보다 현실적인 시나리오는 using 문에서 예외가 발생하고 Commit() 문이 아직 실행되지 않은 경우입니다.

EDIT3는 : 대답에서 나는이 우호적이라고 생각 :

using (OracleConnection conn = new OracleConnection(connStr)) 
using (OracleTransaction trans = conn.BeginTransaction()) 
using (OracleCommand command = new OracleCommand(cmdTxt, conn, trans)) 
{ 
    command.ExecuteNonQuery(); 
    trans.Commit(); 
} 

깔끔하게 아무것도 처분 무슨 일이 일어나고 있는지 명확하게해야한다.

답변

2

누출되지 않습니다. using 절은 명령이 성공적으로 완료되었거나 예외로 인해 실패했는지 여부에 관계없이 OracleConnection이 삭제되도록 보장하며, 트랜잭션과 함께 처리합니다.

그러나 OracleTransaction은 IDisposable이므로 트랜잭션과 관련하여 using 절을 넣는 것이 좋습니다.

using (OracleTransaction trans = conn.BeginTransaction()) 
{ 
    // ... 
    trans.Commit(); 
} 

이렇게하면 트랜잭션을 정리하는 코드를 독자가 명확하게 알 수 있습니다. 특히 후속 향상이 동일한 연결에서 여러 트랜잭션을 수행하는 경우 중요하게 될 수 있습니다.

아래의 John의 설명에 따르면 OracleCommand를 중심으로 using 문을 사용하여 즉시 정리할 수 있습니다.

+1

OracleCommand와 동일합니다. 일회용품은 폐기 처분해야합니다. –

+0

감사합니다. 존 - 업데이트되었습니다. – itowlson