트랜잭션을 사용하여 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
) 응용 프로그램의 새 인스턴스로 더 이상 작업 할 수 없도록 잠금이 유지됩니다.
내 질문 : 어떻게 이런 상황을 안전하게 처리 할 수 있습니까? 트랜잭션 시작 후 프로세스가 종료되고 트랜잭션을 커밋하거나 롤백 할 수있는 기회가 없습니까? 내가 아는 한, 작업 관리자 ("프로세스"탭)에서 응용 프로그램을 종료하면 인식 할 수 없습니다. 그래서 어떻게 든 자동으로 트랜잭션을 자동으로 중단 할 수 있습니까 (예 : 일부 시간 초과 후) 또는 다른 작업을 수행 할 수 있습니까? 도와주세요.
아니 수정하지만 당신은 테이블 잠금보다이 작업을 수행 할 수 있습니까? 더 작은 거래를 할 수 있니? – Paparazzi