2013-03-11 2 views
4

LinqToSql을 사용하여 행을 추가하려고 할 때 InvalidOperationException이 표시됩니다. 우리는 그것을 사내에서 복제 할 수 없으며 고객 중 단 한 명인 경우 0.06 % 정도 발생하며 데이터베이스는 비교적 간단하게 변경됩니다. (단일 행 삽입 또는 단일 필드 업데이트) 여기Linq DataContext SubmitChanges ZombieCheck의 InvalidOperationException

Message: 
    This SqlTransaction has completed; it is no longer usable. 
Stack Trace: 
    at System.Data.SqlClient.SqlTransaction.ZombieCheck() 
    at System.Data.SqlClient.SqlTransaction.Rollback() 
    at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 

코드의 샘플 조각 (데이터베이스가 기본 키를 자동 생성)

TableName row = new TableName(); 
row.Description = "something"; 
row.Action = "action"; 
Context.TableName.InsertOnSubmit(row); 
Context.SubmitChanges(); 

우리는 SQL 서버 2008 R2를 사용합니다. 삽입 및 업데이트는 서버에서 처리됩니다. 그러나 우리는 여전히 예외를 얻습니다. 이러한 업데이트 및 삽입이 발생하지 않도록해야하는 것은 없습니다. 의존성이나 다른 것들.

이러한 예외/좀비 검사/롤백이 발생하지 않도록하려면 어떻게해야합니까? 아니면 무엇이 문제입니까?

편집 :

추가 검사 후, SubmitChanges에 의해 수행되는 데이터베이스 업데이트()가 실제로 발생한다. 이 예외는 트랜잭션이 성공적으로 완료되고 데이터베이스 행이 새 값으로 업데이트 된 후에 호출됩니다. 주의해야 할

+0

특정 코드 덩어리에서만 발생하는 문제입니까? 그렇다면 어떤 시점에서 '사용 중'블록 안에 있습니까? –

+0

모든 데이터베이스 업데이트 함수는 DataContext SubmitChanges()를 수행하는 공통 함수를 호출합니다. 따라서 항상 실패하는 코드 줄과 동일합니다. – David

답변

0

한 가지는 테이블이 datetime 필드가있는 경우는 삽입에 예외가 발생합니다 있도록 데이터 컨텍스트가 시도하는 경우 LinqToSql (및 EntityFramework는) 기본적으로, 데이터 객체에 nullDateTime에 필드를 할당 할 것입니다 null 값을 삽입하십시오.

당신은 하나의 (a DateTime 개체의 "NULL"값 수 - 01/01/0001)를 MSSQL에서 datetime2 유형을 사용하여이 오류를 해결하기 수 또는 수동으로 데이터 객체의 DateTime 필드 (들) 이전에 유효한 날짜를 지정 삽입/업데이트 할 수 있습니다.

더 자세한 스택 추적이 없으면 이것이 유일한 유일한 문제입니다. HTH.

편집 : http://connect.microsoft.com/VisualStudio/feedback/details/588676/system-data-linq-datacontext-submitchanges-causes-invalidoperationexception-during-rollback#details

루트 문제가 LinqToSql 사용하는 내부 ADO 논리가 정말 트랜잭션 롤백을 처리하기 위해 제대로 구성되지 않은 것 같다 :

은 다음과 같습니다 완전히 드문 일이 아니다 . 내가 알 수있는 유일한 유일한 해결책은 트랜잭션 객체를 LinqToSql에 제공하고 롤백을 직접 관리하는 것인데, 실제로 그렇게 매력적이지는 않습니다.

+0

아니요, 모든 필드가 채워집니다. 시간의 0.06 %가 발생합니다. 간단한 업데이트는 update table set field1 = 'text'와 같습니다. 여기서 primaryKey는 123입니다. 스택 추적의 유일한 다른 부분은 DataContext SubmitChanges() 함수를 호출하는 사용자 함수입니다. – David