2009-06-09 5 views
4

트랜잭션에서 실행해야하는 linq2sql에서 몇 가지 작업을 수행하고 있습니다. 그러나, 내가 트랜잭션 내부에서 사용하는 메소드 중 일부는 linq2sql을 사용하고 자체 트랜잭션 (내부 트랜잭션은 저장 프로 시저 내에서 실행 됨) 내에서 실행됩니다. 이것은, 내가 대신 예외가 내게 SQL Server에 대해 MultipleActiveResultSets를 사용하는 경우를 제외하고여러 개의 중첩 된 트랜잭션 스코프를 사용하는 방법은 무엇입니까?

[TransactionInDoubtException: The transaction is in doubt.] 
    System.Transactions.TransactionStateInDoubt.EndCommit(InternalTransaction tx) +76 
with the inner exception 
[SqlException (0x80131904): There is already an open DataReader associated with this Command which must be closed first.] 

을 제공

[SqlException (0x80131904): The transaction operation cannot be performed because there are pending requests working on this transaction.] 

사람이 이런 식으로 linq2sql와 transactionscopes 작업에서 경험이 있습니까?

답변

0

나는 우리가 현재 작업하고있는 프로젝트에서이 문제를 경험했다. 그리고 나는 sproc로 작업 할 때 dbml 파일을 생성하는 LinqToSql과 관련이 있다는 것을 알고있다. 작동 시키려면 수동으로해야했습니다. LinqToSql 분명히 sproc에서 ISingeResult를 반환하고 오류가 발생했습니다.

오류를 수정 한 사람이 아니지만이 작업과 관련이 있다는 것을 알고 있습니다.

상세 정보 : http://www.west-wind.com/weblog/posts/246222.aspx

2

이 나를 위해 "얼굴을 손바닥"순간이었다,하지만이 정확한 동작을보고 있었다 고려하고, 즉시 나를 때리는하지 않았다, 내가 가서 거라고 생각하고 가능성으로이 게시 : 나는 READUNCOMMITTED위한 TransactionScope에 세트했을 때 나는이 문제를보고 있었다

:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, 
     new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }) 

및 SQL 내 Linq에가 시저의 결과를 반환하는 저장 프로 시저를 호출했다. 문제는 PROC 자체 내에서 WITH (NOLOCK) SQL 힌트를 지정할 수 있으므로 ReadUncommitted 트랜잭션 범위에서 Linq를 SQL 쿼리로 래핑 할 필요가 없다는 것입니다. (적어도 내 경우에는)

1

나는 약간의 데이터를 읽으려고하고 있으며, 읽기가 진행 중일 때 즉시 수정하려고한다.
이 경우 가장 쉬운 방법은 모든 데이터를 먼저 읽는 것입니다 (예 : IEnumerable <> .ToList() 확장 메소드 사용). 그런 다음 데이터에 대한 모든 작업을 수행하십시오.

+0

위의 비슷한 문제가 내게 +1 내게 끝났다 :) – James

0

나는 이것이 낡은 스레드라는 것을 알고 있지만이 오류에 대한 Google의 최상위 히트입니다. 그래서 제 대답을 추가할만한 가치가 있다고 생각했습니다. 필자의 경우 엔티티 프레임 워크를 사용했기 때문에 심지어 적용 할 수는 없지만 EF를 사용하는 일부 사람들이 여기에 올 가능성이 높습니다. 내 경우에는 저장된 proc을 호출하고 리턴 된 행을 가지고 아무것도 수행하지 않았기 때문입니다. EF가 행을 다시 읽지 않았기 때문에 이것은 "열린 연산"이었습니다. 내 솔루션은 간단하게 모든 프로 시저 호출 끝에 First() 추가하는 것입니다 :

myentities.CallMyStoredProc(A, B, C).First(); 
관련 문제