2009-01-13 6 views
5

다중 스레드 응용 프로그램에서 SQL Server Compact Edition 3.5.1.0 SP1을 실행하고 있습니다. 응용 프로그램은 임의로 트랜잭션에서 삽입 쿼리를 실행합니다. 짧은 거래의 경우 제대로 작동합니다. 에 시도Sql Compact에서 임의로 AccessViolationException을 생성합니다.

AccessViolationException 보호 된 메모리를 읽거나 쓰기 : 트랜잭션은 더 이상 얻을 내가 디버그 모드에서 응용 프로그램을 실행할 때 실행 사이의 지연 시간이 짧아 질이나 때, SQLCE 무작위로 다음과 같은 예외를 발생하기 시작합니다. 이 은 종종 다른 메모리가 손상되었음을 나타냅니다. System.Data.SqlServerCe.SqlCeCommand에서 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand에서 System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() (CommandBehavior를 행동, 문자열 방법, ResultSetOptions 옵션)에서

D에 SqlCompactTest.TransactedCommandGroupExecutionTest.Test()에서 .ExecuteNonQuery() : 프로젝트 \ \ 운동장 \ SqlCompactTest \ SqlCompactTest TransactedCommandGroupExecutionTest.cs \ 라인 을,174에 SqlCompactTest.ExecutionTest.RunTest()에서 51,515,D : \ 프로젝트 \ 운동장 \ SqlCompactTest \ SqlCompactTest ExecutionTest.cs \ D 선에 SqlCompactTest.ExecutionTest.TimerElapsed (개체 송신자 ElapsedEventArgs E)에서 60 : 프로젝트 \ \ 운동장 \ SqlCompactTest \ SqlCompactTest \ ExecutionTest.cs : 라인 에서 68 System.Timers.Timer.MyTimerCallback

을 ( 상태 개체) 내가 실행하고 코드는 다음과 같습니다이 코드는 TW에서 동시에 실행

IDbConnection connection = m_connectionProvider.GetConnection(); // Just returns new connection 

connection.Open(); 
IDbTransaction transaction = connection.BeginTransaction(); 

foreach (IDbCommand command in m_commands) 
{ 
    command.Connection = connection; 
    command.ExecuteNonQuery(); // This line throws exception 
    Thread.Sleep((int)m_delayBetweenExecutions); 
} 

transaction.Commit(); 
connection.Close(); 

스레드. 연결 문자열은 다음과 같습니다

"Data Source=testDB.sdf;Encrypt Database=True;Password=test;File Mode=Read Write;Persist Security Info=False;Max Database Size=1024" 

나는 등 최적화를 다시 프레임 워크 1.1으로 되 돌리는 방법은 인수의 순서를 변경, 활성화/비활성화처럼 인터넷에 터무니없는 해결책을 찾았지만 그들 중 누구도 나를 위해 일하지 않는다. 나는 또한 possible solutions on microsoft sites을 통해 반복했지만 나에게 도움이되는 해결책을 찾을 수 없었다. 데이터베이스 파일 버전은 3.5.0.0입니다.

나는이 문제를 어떻게 해결할 수 있습니까?

답변

5

당신이 command.Connection에 대한 연결을 설정했다고해서 그것이 설정되었음을 의미하지는 않습니다.

command.Connection = connection; 
command.Connection.GetHashCode() == connection.GetHashCode(); // may return false. 

이것이 원인입니다. connection.CreateCommand();를 사용하여 수정할 수 있습니다.

+0

오류가 수정 되었습니까? 지금은 대답 –

3

SQL CE objects are not thread-safe. 또한 동일한 기사에서는 버전 불일치 상황을 나열합니다 (필자의 경우).

+0

이 필요합니다. 나는 똑같은 예외를 겪었습니다. 다른 프로세스가 그것을 사용하는 동안 내 컨텍스트에 액세스 한 배경 작업자를 호출하는 것은 정확히 이것이었습니다. – Hannish