Verrouillage des entités avec ORDA

Traduit automatiquement de Deepl

La série ORDA continue ! Dans ce billet de blog, nous allons voir comment vous pouvez utiliser les verrous dans vos bases de données avec les concepts ORDA! Il n’est pas rare de devoir gérer des conflits qui peuvent survenir lorsque plusieurs utilisateurs ou processus chargent et/ou tentent de modifier les mêmes enregistrements en même temps. Le verrouillage des enregistrements est une méthodologie utilisée dans les bases de données relationnelles pour éviter les mises à jour incohérentes des données.

ORDA fournit un mode de verrouillage optimiste en plus de celui que vous connaissez déjà (verrouillage pessimiste).

Exemple : comment utiliser le verrouillage pessimiste avec ORDA

Different locking modes

ENREGISTREMENTS ET ENTITÉS

Pour rappel, un enregistrement est le document physique de la base de données auquel on accède par le biais d’une entité. Une entité est une référence sur un enregistrement (voir la section Entité dans le glossaire). Les enregistrements sont verrouillés et déverrouillés par les entités.

Verrouillage optimiste

Dans le cas d’un verrouillage optimiste, un enregistrement est vérifié avant d’être sauvegardé pour voir si d’autres processus l’ont modifié depuis que vous l’avez chargé dans une entité. L’avantage est que l’enregistrement n’est verrouillé que pendant la méthode de sauvegarde.

Le verrouillage optimiste repose sur le cachet des enregistrements. Chaque enregistrement possède un cachet interne qui est automatiquement incrémenté chaque fois que l’enregistrement est sauvegardé dans la base de données. Si un enregistrement a été mis à jour depuis que vous avez chargé une entité, les méthodes save(), drop() et lock() renverront un code d’état spécifique indiquant que le cachet a changé. Vous devrez alors décider quoi faire pour gérer ce conflit.

Par défaut, ORDA fonctionne avec un verrouillage optimiste, mais un verrouillage pessimiste est également disponible.

EXEMPLE

C_OBJECT($employee;$statusSave)

// Get the first employee whose last name is "Wates"
$employee :=ds.Employee.query("lastName=:1" ; "Wates").first()

If ($employee#Null)
// Set name to "Mac Arthur"
$employee .lastName:= "Mac Arthur"
// Sauvegarde de l'employé
$statusSave :=$employee.save()
// Test if the save is successful
If ($statusSave.success)
ALERT ("Successfully saved !")
End if
End if
// L'enregistrement dans la base de données a été mis à jour

Je suis sûr que vous êtes impatient d’en savoir plus sur le verrouillage optimiste. Un autre article de blog, entièrement consacré à ce concept, sera bientôt publié. Restez à l’écoute !

Pessimistic locking

En mode de verrouillage pessimiste , les enregistrements sont verrouillés lors de leur lecture afin que les autres processus ne puissent pas les mettre à jour. Cela garantit qu’un enregistrement modifié peut être écrit au détriment du verrouillage des enregistrements pour les autres utilisateurs. L’enregistrement est verrouillé même s’il n’y a pas d’accès simultané.

Avec le verrouillage pessimiste, vous devez verrouiller les enregistrements avant de les mettre à jour et les déverrouiller après la mise à jour. Tant qu’un enregistrement est verrouillé, l’enregistrement, la suppression ou le verrouillage de l’enregistrement dans d’autres processus échouera jusqu’à ce qu’il soit déverrouillé par le processus qui l’a verrouillé.

Pour verrouiller une entité, utilisez la méthode lock() et la méthode unlock() pour la déverrouiller.

Le 4D « classique » utilise un verrouillage pessimiste.

EXEMPLE

C_OBJECT($employee;$statusLock;$statusSave;$statusUnLock)

// Get the first employee whose last name is "Wates"
$employee :=ds.Employee.query("lastName=:1" ; "Wates").first()

If ($employee#Null)
$statusLock :=$employee.lock() // Lock the entity
// The entity has been successfully locked
If ($statusLock.success)
$employee .lastName:= "Mac Arthur" // Set name to "Mac Arthur"
// Save employee-No need to check the status because the entity is locked
$statusSave :=$employee.save()
// Unlock entity, so other processes will be able to save/drop/lock it
$statusUnLock :=$employee.unlock()
End if
End if
// The record in the database has been updated

N‘ayez pas peur d’oublier de déverrouiller un enregistrement, ORDA le déverrouillera automatiquement s’il n’y a plus de références sur l’entité qui l’a verrouillé.

Avatar
- Product Owner - Marie-Sophie Landrieu-Yvert a rejoint l'équipe de 4D Product en tant que Product Owner en 2017. En tant que Product Owner, elle est en charge de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation de la fonctionnalité livrée répond au besoin du client.Marie-Sophie est diplômée de l'école d'ingénieur ESIGELEC et a commencé sa carrière en tant qu'ingénieur chez IBM en 1995. Elle a participé à divers projets (projets de maintenance ou de construction) et a travaillé en tant que développeur Cobol. Elle a ensuite travaillé en tant que concepteur UML et développeur Java. Dernièrement, ses principaux rôles étaient d'analyser et de rédiger des exigences fonctionnelles, de coordonner les équipes commerciales et de développement.