2009-06-02 6 views
5

나는 이런 식으로 뭔가 (ClearImportTable 및 InsertPage 저장 프로 시저를하는) 보이는 코드 조각이 :저장 프로 시저를 사용하는 LINQ의 트랜잭션을 SQL에 어떻게 적용합니까?

datacontext.ClearImportTable() //Essentially a DELETE FROM table 
for (int i = 1; i < MAX_PAGES; ++i){ 
    datacontext.InsertPage(i); //Inserts data into the table 
} 

이 내 코드의 다소 단순화 된 버전입니다,하지만 아이디어는 삽입하기 전에 테이블을 지 웁니다이다 기록. 유일한 문제는 ClearImportTable 다음에 오류가 발생하면 테이블의 모든 데이터가 지워집니다. 트랜잭션에이 오류를 감쌀 수있는 방법이 있습니까? 그렇다면 오류가있는 경우 모든 것이 다시 원래 상태로 돌아 가게됩니다. 예외가 발생하거나 사용하여 블록이 롤백됩니다 사용하여 블록 내에서 수행 transaction.Complete()를 모든 타격 방치하면

using (var transaction = new TransactionScope()) 
{ 
    // do stuff here... 
    transaction.Complete(); 
} 

:

답변

9

당신은 트랜잭션 범위를 할 수 있습니다.

System.Transactions 어셈블리를 참조해야합니다.

+0

MSDTC를 사용해야하므로 항상 좋은 생각은 아닙니다. –

+0

MSDTC는 변환 내에서 둘 이상의 linq datacontext를 만들고 쿼리를 실행하는 경우에만 필요하다고 생각합니다. 트랜잭션 범위 내에서 하나의 datacontext 객체 만 만들면 필요하지 않습니다. –

+1

MSDTC는 여러 리소스 관리자가 관련된 경우에만 필요합니다. 단일 DataContext 만 사용하고 단일 SQL Server 인스턴스에 연결하는 한 가벼운 트랜잭션을 사용해야합니다. – jrista

0

DataContext에서 Transaction 속성을 설정 하시겠습니까?

9

"Sailing Judo"위에서 언급 한 것처럼, 나는 저장된 procs를 호출해야 할 때 큰 성공을 거둔 TransactionScope 블록을 사용했습니다. 그러나 "트랜잭션이 의심 스럽다"라는 예외가 던져지는 곳으로 나는 하나의 "잡았다"가 있습니다. 이 문제를 해결하기 위해 proc에서 nondeferred 메서드를 호출하여 결과를 즉시 평가하도록해야했습니다. 그래서 그 대신

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc(); 
    transaction.Complete(); 
} 

의 I이 예에서 ... 같이

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc().ToList(); 
    transaction.Complete(); 
} 

를 호출했다, ToList()는 LINQ 즉시 결과를 평가하는 원인이 어떤 nondeferred 방법이 될 수 있습니다.

LINQ 지연 성 (지연된) 특성이 트랜잭션 타이밍과 관련이 없기 때문에 발생한다고 가정합니다. 그러나 이는 단지 추측에 불과합니다. 누군가가 이것에 대해 더 많은 빛을 비출 수 있다면, 나는 그것에 대해 듣고 싶습니다.

관련 문제