0

SqlServer CE 3.5를 데이터베이스로 사용하는 WinForm 응용 프로그램이 있습니다. 필자는 db 작업을 위해 형식화 된 데이터 집합 쿼리를 사용합니다. 이 작업에 트랜잭션을 사용해야합니다. 문제는 서로 다른 어셈블리에 흩어져 있다는 것입니다. 내 질문은 단일 트랜잭션에서 모든 항목을 실행하려면 무엇을 사용해야합니까?현재 트랜잭션을 전달하거나 DependentClone을 사용 하시겠습니까?

//transaction should start here 
this.QueryDb(); 
MyOtherAssembly.myClass.QueryDbForSomethingElse(); 
System.IO.File.Delete(fileName); 
//end transaction 

내가 TransactionScope를 사용하여 생각하고 있지만,이 상황에서 일하는 것이 예를 들면 다음과 같습니다 조작입니까? File.Delete()이 실패하면 QueryDbForSomethingElse() 롤백을 의미합니까? Transaction.Current 또는 Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete)을 매개 변수로 전달해야하며 전달 된 매개 변수를 사용하여 새 트랜잭션을 생성해야합니까?

이 문제에 대한 의견을 보내 주시면 감사하겠습니다.

답변

0

TransactionScope는 어셈블리 전체에서 작동합니다. 실제로는 이 아니며 코드는입니다. 오히려, 현재 실행 컨텍스트에 묶여 있습니다 (실수가 아니라면 현재 스레드).

그러나 Windows 파일 시스템은 트랜잭션이 아니므로 트랜잭션에 코드를 등록하는 방법에 관계없이 파일 작업은 그 부분에 아무런 영향을 미치지 않습니다. 트랜잭션 파일 시스템을 얻을 때까지는 파일 작업이 포함 된 경우 ACID 트랜잭션을 보장하는 응용 프로그램을 작성할 수 없습니다.

대신 보상 조치를 명시 적으로 구현해야합니다.

FWIW 그러나 Juval Lowy의 MSDN Magazine 기사 Can't Commit? Volatile Resource Managers in .NET Bring Transactions to the Common Type을 참조하십시오.

+0

감사합니다. 내가 명확해야하고 트랜잭션 파일을 삭제할 필요가 없으며 작업이 멀티 스레드가 아니어야한다고 덧붙였습니다. – dstr

관련 문제