sql-server - requestscoped - upload file jsf




Modification des enregistrements de base de données par plusieurs utilisateurs (6)

J'ai conçu des tables de base de données (normalisées, sur un serveur MS SQL) et créé un frontend windows autonome pour une application qui sera utilisée par une poignée d'utilisateurs pour ajouter et modifier des informations. Nous allons ajouter une interface Web pour permettre la recherche à travers notre zone de production à une date ultérieure.

Je suis préoccupé par le fait que si deux utilisateurs commencent à éditer le même enregistrement, le dernier à valider la mise à jour serait le 'gagnant' et des informations importantes pourraient être perdues. Un certain nombre de solutions me viennent à l'esprit, mais je ne suis pas sûr si je vais créer un plus gros mal de tête.

  1. Ne faites rien et espérez que deux utilisateurs n'éditeront jamais le même enregistrement en même temps. - Peut-être jamais eu de suite mais que faire si ça le fait?
  2. La routine d'édition peut stocker une copie des données d'origine ainsi que les mises à jour, puis comparer lorsque l'utilisateur a terminé la modification. Si elles diffèrent, afficher la mise à jour de l'utilisateur et de la mise à jour - Cela nécessiterait le stockage de deux copies de données.
  3. Ajoutez la dernière colonne DATETIME mise à jour et vérifiez qu'elle correspond à la mise à jour, sinon affichez les différences. - nécessite une nouvelle colonne dans chacune des tables pertinentes.
  4. Créez une table d'édition qui enregistre lorsque les utilisateurs commencent à modifier un enregistrement qui sera vérifié et empêche les autres utilisateurs d'éditer le même enregistrement. - nécessiterait une réflexion réfléchie sur le déroulement du programme pour éviter que des interblocages et des enregistrements ne soient verrouillés si un utilisateur se retire du programme.

Y a-t-il de meilleures solutions ou dois-je choisir l'une de ces solutions?


La base de données le fera pour vous. Regardez "sélectionnez ... pour la mise à jour", qui est conçu uniquement pour ce genre de chose. Il vous donnera un verrou en écriture sur les lignes sélectionnées, que vous pourrez ensuite valider ou annuler.


Une autre option consiste à tester que les valeurs dans l'enregistrement votre changement sont les mêmes que celles où vous avez commencé:

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

(affiche le champ customer_nm et l'utilisateur le 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 n'avez pas besoin d'ajouter une nouvelle colonne à votre table (et de la maintenir à jour), mais vous devez créer des instructions SQL plus verbeuses et transmettre les champs "new" et "old" à la procédure stockée.

Il a aussi l'avantage que vous ne verrouillez pas les disques - parce que nous savons tous que les disques finiront par rester bloqués quand ils ne devraient pas être ...


Une approche classique est la suivante:

  • ajouter un champ booléen, "verrouillé" à chaque table.
  • Définissez ceci sur false par défaut.
  • Quand un utilisateur commence à éditer, vous faites ceci:

    • verrouillez la ligne (ou toute la table si vous ne pouvez pas verrouiller la ligne)
    • vérifiez le drapeau sur la ligne que vous voulez éditer
    • si le drapeau est vrai alors
      • informer l'utilisateur qu'il ne peut pas modifier cette ligne pour le moment
    • autre
      • mettre le drapeau à true
    • relâchez le verrou

    • lors de la sauvegarde de l'enregistrement, remettez le drapeau à false


Avec moi, la meilleure façon d'avoir une colonne lastupdate (timetamp datatype). Lorsque sélectionner et mettre à jour il suffit de comparer cette valeur une autre avance de cette solution est que vous pouvez utiliser cette colonne pour traquer le temps que les données ont changé. Je pense que ce n'est pas bien si vous créez juste une colonne comme isLock pour la mise à jour de vérification.


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

L'équivalent SQL Server est l'indicateur d'instruction SELECT UPDLOCK .

Consultez la documentation en ligne de SQL Server pour plus d'informations.


-premier create filed (heure de mise à jour) pour enregistrer l'enregistrement de dernière mise à jour -lorsqu'un utilisateur sélectionne enregistrement enregistrer sélectionne l'heure, compare entre select time et mise à jour time field if (heure de mise à jour)> (select time) signifiant qu'un autre utilisateur met à jour cet enregistrement après sélection record





database