2013-10-30 1 views
6

트랜잭션을 사용하여 SQL Server 데이터베이스 내의 테이블에서 데이터를 조작하는 C# 응용 프로그램이 있습니다. 코드는 매우 간단하고 기본적으로 다음과 같이 간다 : 실행중인 활성 응용 프로그램 인스턴스가 없었다 동안트랜잭션 시작 후 클라이언트 프로세스가 종료 된 경우 데이터베이스 테이블이 잠긴 상태로 유지됨

public string ConnectionString; 
public OleDbConnection DbConnection; 
public OleDbTransaction DbTransaction; 

// ... some initialization stuff ... 

DbTransaction = DbConnection.BeginTransaction(); 
try 
{ 
    // ... some insert/update/delete here ... 
    DbTransaction.Commit(); 
} 
catch (Exception e) 
{ 
     // ... 
     DbTransaction.Rollback(); 
} 

은 지금 상황은, 테이블/행 집합이 잠겨 남아 있음을, 고객이보고되었다. 그의 첫 번째 추측은 트랜잭션 중에 오류가 발생했으며 롤백이있는 try-catch-block이 없다는 것입니다 (그러나 적절한 오류 처리가 있기 때문에이 경우는 분명하지 않습니다). DbTransaction.Commit(); 전에 디버거에서 중단 점을 설정하고 Windows 작업 관리자에서 프로세스를 종료하면 상황을 재현 할 수 있습니다. 그런 다음 트랜잭션은 열린 상태로 유지되고 (실행 중임을 알 수 있습니다. DBCC OPENTRAN) 응용 프로그램의 새 인스턴스로 더 이상 작업 할 수 없도록 잠금이 유지됩니다.

내 질문 : 어떻게 이런 상황을 안전하게 처리 할 수 ​​있습니까? 트랜잭션 시작 후 프로세스가 종료되고 트랜잭션을 커밋하거나 롤백 할 수있는 기회가 없습니까? 내가 아는 한, 작업 관리자 ("프로세스"탭)에서 응용 프로그램을 종료하면 인식 할 수 없습니다. 그래서 어떻게 든 자동으로 트랜잭션을 자동으로 중단 할 수 있습니까 (예 : 일부 시간 초과 후) 또는 다른 작업을 수행 할 수 있습니까? 도와주세요.

+0

아니 수정하지만 당신은 테이블 잠금보다이 작업을 수행 할 수 있습니까? 더 작은 거래를 할 수 있니? – Paparazzi

답변

관련 문제