mercredi 2 mars 2016

Requêter sans verrouiller les tables (Table Lock)

Par défaut, lorsque vous effectuez une requête sur la base de données MS CRM la transaction verrouille la (ou les) table(s) utilisée(s) dans cette requête.
Si vous lancez plusieurs requêtes en parallèle sur les mêmes données, ce mécanisme de verrouillage peut augmenter drastiquement le temps de récupération.
Il est possible d'indiquer au système de ne pas utiliser ce système de verrouillage (pour les anglophones : Table Lock).

Tout d'abord, soyez prudents ! Le verrouillage des tables est une fonctionnalités essentielles des SGBD relationnels, sans ce mécanisme un environnement multi-utilisateur ne peut pas fonctionner correctement.

Prenez le temps de lire l'article suivant si vous n'êtes pas familier avec la notion de verrous : Guide du verrouillage SQL Server.

Une fois que vous avez pris connaissance de ce concept, vous pouvez utiliser la clause no-lock pour augmenter les performances de vos requêtes.

Suivant votre préférence ou vos besoins, je vous propose deux méthodes. La première avec les Query Expression, il suffit de mettre la propriété NoLock à true :
var query = new QueryExpression
  {
    EntityName = "entitylogicalname",
    ColumnSet = new ColumnSet(true),
    NoLock = true
  };
EntityCollection ec = _orgService.RetrieveMultiple(query); // Où _orgService est une instance de IOrganizationService

La seconde avec du FetchXML, là encore c'est très simple, il suffit d'ajouter l'attribut no-lock dans le noeud fetch :
<fetch version='1.0' output-format='xml-platform' mapping='logical' no-lock='true' >
  <entity name='account'>                                                                
    <all-attributes />
  </entity>
</fetch>

Sources :
MSDN - QueryExpression.NoLock Property
MSDN - FetchXML schema