Il y a quelques jours, j'ai testé la gestion du "lock" sous Linq to SQL en cas de modification de tuple pendant la manipulation de l'objet chargé. J'avais rédigé un mini commentaire ici. Après avoir vu la remarque de Steve, j'ai décidé d'aller plus loin dans LINQ to SQL et sa gestion du lock. Après avoir réutilisé mon exemple, voici quelques remarques.

Par défaut, lors d'une mise à jour d'un tuple, Linq2SQL va utiliser tous les champs dans sa clause WHERE. Il est cependant possible de modifier ce comportement via un paramètre "UpdateCheck" nommé de l'attribut ColumnAttribute qui se place au dessus des propriétés ... Ce paramètre accepte un enum qui a trois valeurs.

  1. Never => La propriété n'entre jamais en ligne de compte.
  2. Allways => (valeur par défaut). La propriété entre toujours en ligne de compte dans un update.
  3. WhenChanged => La propriété n'est prise en compte que si elle est modifiée.
Cela offre une grande souplesse, il est donc possible de faire un lock sur un champ d'une table .. par exemple un timestamp ... et les autres champs prendront "never".


L'autre possibilité est le "pessimistic locking" (désolé ... je ne connais pas le terme en français ;-). Il est possible de bloquer un tuple le temps d'une modification. Ceci ne m'a jamais semblé une bonne idée ... Cela ajoute un lag voir des problèmes d'accès en cas de plantage etc. Mais il est intéressant d'avoir connaissance de l'existence de cette possibilité dans LINQ to SQL.