2008-12-05 7 views
2

J'ai une application Web (ASP.net 2.0) avec une base de données (SQL Server) en arrière-plan. J'étudie des manières de gérer la concurrence d'accès à la base de données si deux utilisateurs insèrent les mêmes données dans la même table en même temps. Y a-t-il un moyen de gérer ce cas? Merci d'avance.Concurrence de la base de données de l'application Web

Jimmy

+0

Utilisez-vous une couche d'O/R? –

Répondre

1

Tout ce que vous avez besoin est:

 
BEGIN TRANSACTION; 
INSERT XXXXXX INTO TABLE1 ...... 
INSERT YYYYY INTO TABLE2 ........ 
COMMIT; 
if (commit_failed) { tell user to try again!; }; 

SQLserver prendra soin du reste.

1

Si vous tentez d'éviter les doublons, la réponse la plus simple consiste à créer un index UNIQUE sur la colonne que vous souhaitez être unique.

Si vous tentez d'empêcher plusieurs utilisateurs de modifier le même enregistrement en même temps, il est préférable d'ajouter un horodatage modifié à la table. Lorsque vous lisez l'enregistrement à afficher à l'écran, vous lisez l'horodatage, et juste avant d'écrire les modifications, vous vérifiez à nouveau l'horodatage. Si cela a changé, cela signifie qu'un autre utilisateur a modifié l'enregistrement et vous devez empêcher l'écriture de la modification.

0

sans savoir comment vos entretiens de code C# à la base de données (O/R, ADO.NET ...), il est difficile de vous donner une réponse utile ...

EDIT: tous les exemples sont grands, mais ils ne vont pas aider s'il utilise SubSonic par exemple.

+0

En fait, pour le cas INSERT, les index uniques fonctionneront indépendamment de la bibliothèque de base de données. – Brannon

+0

Pour le cas UPDATE, j'espère que la plupart des bibliothèques supportent la concurrence optimiste. Bien sûr, ADO.NET le fait, mais LINQ to SQL le fait aussi. Je ne peux pas parler pour Subsonic, mais je crois que vous pourriez coder le contrôle Timestamp dans vos requêtes Subsonic. Faites-moi savoir si ce n'est pas le cas. – Brannon

+0

Brannon - c'était mon point de vue, s'il utilisait un outil ORM, il traitera probablement de la concurrence. Comment est-ce pour une réponse rapide! Juste remarqué le vote vers le bas. –

4

Pour éviter que les mêmes données soient INSÉRÉES en même temps, utilisez un index unique sur les colonnes que vous souhaitez être unique. Le premier INSERT va réussir, gérer l'erreur pour la perte INSERT de manière appropriée.

Pour empêcher les utilisateurs 2+ de modifier le même enregistrement (existant) en même temps, utilisez la simultanéité optimiste http://en.wikipedia.org/wiki/Optimistic_concurrency_control. Avec SQL Server, il est facile d'implémenter une concurrence optimiste en utilisant une colonne TIMESTAMP. Lisez l'horodatage avec vos données. Lors de la mise à jour de la ligne, vérifiez que la valeur de l'horodatage est la même. Si les horodatages ne correspondent pas, l'utilisateur a (voyait) une ligne obsolète. Manipulez ce cas de manière appropriée.

Un exemple en utilisant SqlClient:

command.CommandText = @" 
    UPDATE tbl 
    SET LastName = @LastName, FirstName = @FirstName 
    WHERE ID = @ID AND Timestamp = @Timestamp 
    "; 

int rowCount = command.ExecuteNonQuery(); 
if (rowCount != 1) 
    throw new DBConcurrencyException(); 
Questions connexes