2011-08-26 7 views
2

트랜잭션 기간 동안 (동일한) SQL 연결을 열어 두어야하며 BeginTransaction을 호출 한 것과 동일한 연결에서 CommitTransaction 및 RollbackTransaction을 호출해야합니다.SQL 연결 및 트랜잭션

우리는 등 commit- 및 rollbacktransactions뿐만 아니라 일반적인 선택을 begin-하는 방법과 데이터베이스 헬퍼 클래스, 저장 실행 시저를 가지고

도우미 클래스는 다음과 같이 다소 같습니다

public class DatabaseHelper 
{ 
    public void BeginTransaction() 
    { 
     // open connection, but dont close it. 
    } 

    public void CommitTransaction() 
    { 
     // close the connection 
    } 

    public void RollbackTransaction() 
    { 
     // close the connection 
    } 
는 그래서 이것을 우리는 이와 같은 (I 선호했습니다 것이다) 일반적인 작업을 수행 할 수 없기 때문에

:

using (sqlCon = new SqlConnection(connectionString)) 
{ 
    // sql operations here 
} 

는 헬퍼 클래스는 현재 연결을 잎 기존 트랜잭션이있는 한 열어서 커밋 또는 롤백 중에 닫습니다. 그러나 그것이 정말로 그것을 할 수있는 가장 좋은 방법인지 궁금합니까? 거래가 진행되는 동안 연결이 열려 있어야합니까?

+0

? BeginTransaction은 최소한 Commit 메소드로 전달할 트랜잭션을 반환해야합니다! –

+0

그래, 나도 맘에 안들지만, 다른 사람이 작성한 기존 생산 코드를 수정하고 있으므로, 이미 테스트되고 "작동 중"인 것을 가능한 한 적게 변경하려고합니다. – Ghlouw

답변

2

네, 그것은 열려있게해야합니다. 클래스의 OnDispose를 처리하고 그 연결을 삭제할 수 있습니다.

다음
public class DatabaseHelper : IDisposable 
{ 
    public void Dispose() 
    { 
     //close/dispose connection here 
    } 
} 

당신이 할 수있는 ...

당신이 도우미로 작업 할 수있는 방법
using(DatabaseHelper db = new DatabaseHelper()) 
{ 
} 
+0

@ Ghlouw : musefan이 제안한 것을 구현하는 경우 Dispose에서 연결이 아직 열려 있는지 확인할 수도 있습니다. 그렇다면 변경 사항을 원하는대로 커밋하십시오. 원할 경우 명시 적으로 롤백 할 수 있지만 Ben Robinson이 말한 것처럼 SQL 세션이 보류중인 변경으로 종료되면 자동으로 롤백됩니다. – Tipx

+1

@Tipx, 아직 보류중인 트랜잭션이있는 경우 처분시 기본값이 롤백되어야한다고 생각합니다. 개발자가 명시 적으로 커밋을 요구하지 않았기 때문에 에러가 발생했을 때 커밋을 기본으로 가정하는 것은 좋지 않을 것입니다. – musefan

+0

나는 그렇게 생각합니다. 그러나 그는 그가 원하는대로 할 수 있다고 지적했습니다! – Tipx

1

커밋 전에 연결이 닫히면 트랜잭션이 자동으로 롤백됩니다. 귀하의 도우미 클래스는 연결을 생성하고 처분 할 필요가 없습니다. 연결을 관리하고 열기 및 닫기를 할 필요가 없습니다. 생성자에서 연결 매개 변수를 사용하기 만하면 일반적인 구문을 사용할 수 있습니다.

예컨대 :

using (sqlCon = new SqlConnection(connectionString)) 
{ 
    DatabaseHelper helper = new DatabaseHelper(sqlCon); 
    helper.BeginTransaction(); 
    try 
    { 
     //Sql stuff 
     helper.CommitTransaction(); 
    } 
    catch(SqlException) 
    { 
     helper.RollbackTransaction(); 
    } 
} 
+0

트랜잭션은 롤백되지만 트랜잭션을 시작한 후에 코드를 확인하고 테이블을 잠근 경우 테이블이 잠겨 있으면 SQL 클라이언트를 확인하십시오. 그렇다면 디버거를 중지 한 다음 테이블이 더 이상 잠겨 있지 않은지 확인하십시오. – Tipx