2010-02-26 5 views
1

J'ai une table avec des statistiques de hit pour certains éléments d'une autre table.Enregistrer ou mettre à jour avec LinqToSql, transactions?

Ce tableau est défini comme celui-ci

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

me donner ai un dossier pr. article pr jour.

La base de données est utilisée dans un environnement multithread, donc deux utilisateurs peuvent faire le premier hit en même temps provoquant la création de deux enregistrements, où je veux seulement 1 avec hits = 2. (à cause d'un index unique j'obtiendrais une exception à la place)

Comment est-ce que je m'assure que j'ai seulement un pr record. article pr. journée?

Répondre

1

Une façon de gérer cela est par l'index que vous créez dans SQL Server. Avec SQL Server, vous pouvez créer un index unique, mais au lieu de le faire lever une exception lorsque vous tentez d'ajouter un doublon, il ignore simplement le doublon. Pour ce faire, assurez-vous que le type d'index est « Index » et définir «Ignorer les doubles de clés de la« oui

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

index uniques travailleraient. Cela ne permettrait qu'un seul enregistrement. Alternativement, vous pouvez configurer dans un code un verrou, vérifier l'existence d'un enregistrement avec cet ID, si l'enregistrement existe évitez l'insertion et informez les utilisateurs du problème. Mais si null, alors vous allez de l'avant avec l'insertion.

EDIT: Un verrou peut être configuré comme:

public static object _lock = new object(); 

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

Il est souvent recommandé de faire la vérification avant et après la serrure, parce que le verrou est libéré, peut-être sauvé un utilisateur précédent, l'enregistrement, mais vous devez également vous préoccuper de la performance de la base de données ici, alors peut-être que le faire dans le verrou est OK ... vous devez également être conscient que cela empêchera les autres utilisateurs d'enregistrer l'enregistrement au point de verrouillage et pourrait affecter la performance de votre application si la base de données est lente ... quelque chose que vous devez savoir.

HTH.

+0

Je ne suis pas un expert en SQL Server ou des objets de synchronisation .Net, mais par "un verrou" voulez-vous dire quelque chose comme un Mutex qui fonctionnerait en interne dans le processus d'application .Net? – Karsten

+0

Un Mutex fonctionnerait, et vous pouvez également utiliser le mot clé lock comme illustré ci-dessus pour configurer un verrou qui limite le code à un utilisateur. –

Questions connexes