2010-02-26 4 views
1

다른 테이블의 일부 항목에 대해 히트 통계가있는 테이블이 있습니다.LinqToSql, 트랜잭션을 사용하여 새로 저장하거나 업데이트 하시겠습니까?

이 표는 나를 기록 홍보를주는이

ID (Primary key) 
ItemId (Foreign key) 
Date 
Hits 

과 같이 정의된다. 항목 pr 하루.

데이터베이스는 다중 스레드 환경에서 사용되므로 두 명의 사용자가 동시에 첫 번째 히트를 수행하여 두 개의 레코드를 생성 할 수 있습니다. 여기서 두 개는 히트 = 2로 1 개만 만들 수 있습니다. (유일한 색인 때문에 나는 예외를 대신 얻을 것입니다)

나는 어떻게 하나의 기록이 있는지 만 확인합니다. item pr. 일?

답변

1

이 문제를 처리하는 한 가지 방법은 SQL Server에서 만드는 인덱스를 사용하는 것입니다. SQL Server를 사용하면 고유 인덱스를 만들 수 있지만 복제를 추가 할 때 예외가 발생하는 대신 단순히 복제를 무시합니다. 이렇게하려면 인덱스 유형이 '인덱스'이고 '중복 키 무시'를 '예'로 설정하십시오.

CREATE UNIQUE NONCLUSTERED INDEX IX_MyIndex ON MyTable 
(
    MyColumn 
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
2

고유 인덱스가 작동합니다. 그러면 단일 레코드 만 허용됩니다. 또는 레코드가 존재하고 삽입물을 피하고 사용자에게이 사실을 알리면 코드에 잠금을 설정하고 해당 ID가있는 레코드의 존재를 확인하십시오. 그러나 null 인 경우 삽입을 진행합니다.

편집 : 잠금이 설정으로 될 수있다 : 잠금이 해제 될 때, 이전 사용자가 레코드를 저장 한 수 있기 때문에 종종 전에 잠금 후 모두 검사를 할 것을 추천

public static object _lock = new object(); 

public void Save(..) 
{ 
    lock(_lock) { 
     //check for existence of an ID 
     //process accordingly 
    } 
} 

, 하지만 여기에도 데이터베이스 성능에 관심을 가져야하기 때문에 자물쇠 내부에서 작업하는 것이 좋습니다. 잠금 위치에서 레코드를 저장하려고 시도하는 다른 사용자가이 작업을 수행 할 수 있다는 사실을 알고 있어야합니다. 데이터베이스가 느린 경우 앱의 성능 ... 당신이 알아야 할 것이 있습니다.

HTH.

+0

저는 SQL Server 나 .NET 동기화 개체의 전문가가 아니지만 "잠금 장치"는 .Net 응용 프로그램 프로세스에서 내부적으로 작동하는 Mutex와 같은 것을 의미합니까? – Karsten

+0

Mutex가 작동하고 위에서 설명한 것처럼 lock 키워드를 사용하여 잠금 블록과 함께 한 사용자에게 코드를 제한하는 잠금을 설정할 수 있습니다. –

관련 문제