enregistrements de base de données d'édition par plusieurs utilisateurs

voix
23

Je tables de base de données conçue (normalisée, sur un serveur MS SQL) et créé une fenêtre autonome extrémité avant pour une application qui sera utilisé par une poignée d'utilisateurs d'ajouter et de modifier les informations. Nous allons ajouter une interface web pour permettre la recherche accross notre zone de production à une date ultérieure.

Je crains que si deux utilisateurs commencent à modifier le même enregistrement puis le dernier de commettre la mise à jour serait le « gagnant » et des informations importantes peuvent être perdues. Un certain nombre de solutions viennent à l'esprit, mais je ne sais pas si je vais créer un plus grand mal de tête.

  1. Ne rien faire et espérer que deux utilisateurs ne vont jamais être modifier le même enregistrement en même temps. - peut - être jamais happed mais si elle le fait?
  2. Routine d'édition peut stocker une copie des données originales ainsi que les mises à jour et comparer lorsque l'utilisateur a terminé l' édition. Si elles diffèrent l' utilisateur du spectacle et comfirm mise à jour - aurait besoin de deux copies de données à stocker.
  3. Ajouter la dernière colonne datetime mise à jour et vérifier qu'il correspond lorsque nous modifions, si pas alors montrer les différences. - exige une nouvelle colonne dans chacun des tableaux correspondants.
  4. Créer une table d'édition qui enregistre lorsque les utilisateurs commencent à l' édition d' un enregistrement qui sera vérifié et empêcher d' autres utilisateurs de modifier même enregistrement. - nécessiterait la pensée carful des flux de programme pour empêcher et blocages des dossiers s'enferment si un utilisateur se bloque sur le programme.

Y a-t-il des meilleures solutions ou devrais-je aller pour un de ces?

Créé 03/08/2008 à 22:23
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
12

Si vous prévoyez des collisions peu fréquentes, Optimiste Concurrency est probablement votre meilleur pari.

Scott Mitchell a écrit un tutoriel complet sur la mise en œuvre ce modèle: la
mise en œuvre Optimiste Concurrency

Créé 03/08/2008 à 22:31
source utilisateur

voix
2

Une approche classique est la suivante:

  • ajouter un champ booléen, « verrouillé » à chaque table.
  • réglez ce paramètre sur false par défaut.
  • lorsqu'un utilisateur commence l'édition, vous faites ceci:

    • verrouiller la ligne (ou toute la table si vous ne pouvez pas verrouiller la ligne)
    • vérifier le drapeau sur la ligne que vous souhaitez modifier
    • si le drapeau est vrai,
      • informer l'utilisateur qu'ils ne peuvent pas modifier cette ligne au moment
    • autre
      • définir l'indicateur true
    • libérer le verrou

    • lors de l'enregistrement du disque, définissez l'indicateur de retour à faux

Créé 01/10/2008 à 09:53
source utilisateur

voix
1

-Premier créer déposés (temps de mise à jour) pour stocker la dernière mise à jour enregistrement -quand tout utilisateur sélectionner ENREGISTRE de gagner du temps de sélection, comparer entre le temps de sélection et le champ de temps de mise à jour si (temps de mise à jour)> (sélectionner le temps) qui signifie une mise à jour de l'utilisateur ce disque après sélection record

Créé 14/07/2016 à 11:23
source utilisateur

voix
1

SELECT FOR UPDATE et équivalents sont bons vous offrir le verrou est posé pour une quantité microscopique de temps, mais pour une quantité macroscopique (par exemple, l'utilisateur dispose des données chargées et n'a pas appuyé sur « Enregistrer », vous devez utiliser comme ci-dessus concurrence optimiste. (Ce qui Je pense toujours est mal nommé - il est plus pessimiste que « dernier auteur gagne », ce qui est généralement la seule autre solution envisagée).

Créé 01/10/2008 à 06:39
source utilisateur

voix
1

Une autre option consiste à vérifier que les valeurs de l'enregistrement que vous changez sont toujours les mêmes comme ils étaient quand vous avez commencé:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(Afficher le champ customer_nm et l'utilisateur qu'il change)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

Vous ne devez pas ajouter une nouvelle colonne à votre table (et le maintenir à jour), mais vous devez créer des instructions SQL et plus verbeux passer de nouveaux et anciens champs à la procédure stockée.

Il a également l'avantage que vous n'êtes pas le verrouillage des enregistrements - parce que nous savons tous que les dossiers finiront par rester bloqué quand ils ne devraient pas être ...

Créé 13/08/2008 à 23:32
source utilisateur

voix
1

@ Mark Harrison: SQL Server ne prend pas en charge cette syntaxe ( SELECT ... FOR UPDATE).

L'équivalent SQL Server est l' SELECTindice de l' instruction UPDLOCK.

Voir SQL Server en ligne pour plus d' informations.

Créé 04/08/2008 à 22:54
source utilisateur

voix
0

Avec moi, la meilleure façon que j'ai une colonne lastupdate (timetamp type de données). lorsque l'on sélectionne et mise à jour juste comparer cette valeur une autre avance de cette solution est que vous pouvez utiliser cette colonne pour traquer les données du temps a changé. Je pense que ce n'est pas bon si vous créez juste un Colum comme isLock pour la mise à jour de contrôle.

Créé 24/06/2011 à 08:14
source utilisateur

voix
0

La base de données fera pour vous. Regardez « select ... mise à jour », qui est conçu juste pour ce genre de chose. Il vous donnera un verrou d'écriture sur les lignes sélectionnées, que vous pouvez ensuite valider ou annuler.

Créé 04/08/2008 à 03:30
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more