2009-12-07 3 views
2

우리는 응용 프로그램에서 LINQ을 사용하여 데이터베이스 쿼리와 명령을 실행합니다. Date 필드의 값을 업데이트하는 테이블에 대한 업데이트에서 동시성 문제가 발생했습니다. 특히, 두 명의 사용자가 정확히 동시에 버튼을 클릭하고 코드가 데이터베이스의 Date 필드를 업데이트하려고 시도하면 내장 된 낙관적 동시성 작업이 실패하고 사용자가 예외를 throw합니다.DBML의 타임 스탬프가 동시성 문제를 해결하고 있습니다 ... 왜?

DBML에 들어가서 필드의 time stamp 속성을 true로 설정하고 단위 테스트를 실행하면 이상한 부분이 있습니다. 명시 적 잠금이 필요 없습니다.

전체 시스템에서이를 구현하기 전에 좀 더 이해하고 싶습니다. 누가 왜이 작품에 대한 이해가 있습니까?

+0

나는 "ASP.NET에서 LINQ"당신은 당신이 SQL로 LINQ를 사용하는 의미로 가정 ...이 실제로 당신이 원하는 행동이 아니라고 생각? – Omar

+0

@Baddie - 예, LINQ는 LINQ를 SQL로 정의했습니다. 이 웹 응용 프로그램 및 따라서 여러 동시 사용자의 문제가 발생할 수 지정하고 싶었 기 때문에 ASP.NET 언급했다. – Adam

답변

2

SQL Server DATETIME은 충돌이 발생할 확률이 가장 높기 때문에 SQL Server DATETIME의 해상도가 최대 3ms이기 때문에 시스템 세부 정보를 알지 못했습니다. TIMESTAMP는 desquise의 카운터이며 충돌 할 수 없습니다.

+0

+1 잘 말했습니다! TIMESTAMP (또는 SQL Server 2008 이상 버전의 ROWVERSION)는 SQL Server 데이터 행의 "버전"을 신뢰할 수 있습니다. –

+0

DBML의 "timestamp"설정이 TIMESTAMP/ROWVERSION 열을 강제하거나 필요로하지 않습니다. – RickNZ

0

메모리에서, 나는이 어떻게 작동하는지 믿는다 그 all 행의 이전 값은 UPDATE가 허용되기 전에 동일합니다.

"타임 스탬프"속성을 True로 설정하면 특정 열이 DB에 의해 자동 생성되고 "시간 소인 유형"열로 사용해야 함을 시스템에 알리는 것입니다. 즉, 해당 열의 값만 UPDATE 이전과 동일하면 UPDATE가 허용됩니다.

DateTime 열에 대해 시간 스탬프가 설정되지 않은 상태에서 단위 테스트가 실패하므로 행의 다른 항목도 변경되어 충돌을 일으키는 것으로 생각됩니다. DateTime 열에서 타임 스탬프가 활성화 된 상태에서 변경 사항은 같은 시간에 서로 가깝게 발생합니다.

SQL 프로필러를 사용하여이 동작을 확인할 수 있어야합니다.

FWIW, 내가

관련 문제