Verrous
Complément indispensable des transactions, les verrous permettent de sécuriser les requêtes en bloquant ponctuellement et
partiellement l'accès aux données.
Il s'agit d'un gros chapitre, avec beaucoup d'informations. Il y a par conséquent un maximum d'exemples pour vous aider à
comprendre le comportement des verrous selon les situations.
Au sommaire de ce chapitre :
Qu'est-ce qu'un verrou ?
Quel est le comportement par défaut de MySQL par rapport aux verrous ?
Quand et comment poser un verrou de table ?
Quand et comment poser un verrou de ligne ?
Comment modifier le comportement par défaut de MySQL ?
Principe
Lorsqu'une session MySQL pose un verrou sur un élément de la base de données, cela veut dire qu'il restreint, voire interdit,
l'accès à cet élément aux autres sessions MySQL qui voudraient y accéder.
Verrous de table et verrous de ligne
Il est possible de poser un verrou sur une table entière, ou seulement sur une ou plusieurs lignes d'une table. Étant donné
qu'un verrou empêche l'accès d'autres sessions, il est en général plus intéressant de poser un verrou sur la plus petite partie de la
base possible.
Par exemple, si l'on travaille avec les chiens de la table Animal.
On peut poser un verrou sur toute la table Animal. Dans ce cas, les autres sessions n'auront pas accès à cette table, tant
que le verrou sera posé. Qu'elles veuillent en utiliser les chiens, les chats, ou autre, tout leur sera refusé.
On peut aussi poser un verrou uniquement sur les lignes de la table qui contiennent des chiens. De cette manière, les
autres sessions pourront accéder aux chats, aux perroquets, etc. Elles pourront toujours travailler, tant qu'elles n'utilisent
pas les chiens.
Cette notion d'accès simultané aux données par plusieurs sessions différentes s'appelle la concurrence. Plus la concurrence est
possible, donc plus le nombre de sessions pouvant accéder aux données simultanément est grand, mieux c'est.
En effet, prenons l'exemple d'un site web. En général, on préfère permettre à plusieurs utilisateurs de surfer en même temps, sans
devoir attendre entre chaque action de pouvoir accéder aux informations chacun à son tour. Or, chaque utilisateur crée une
session chaque fois qu'il se connecte à la base de données (pour lire les informations ou les modifier).
Préférez donc (autant que possible) les verrous de ligne aux verrous de table !
Avertissements
Les informations données dans ce chapitre concernent exclusivement MySQL, et en particulier les tables utilisant les moteurs
MyISAM ou InnoDB (selon le type de verrou utilisé). En effet, les verrous sont implémentés différemment selon les SGDB, et
même selon le moteur de table en ce qui concerne MySQL. Si le principe général reste toujours le même, certains comportements
et certaines options peuvent différer d'une implémentation à l'autre. N'hésitez pas à vous renseigner plus avant.
Par ailleurs, je vous présente ici les principes généraux et les principales options, mais il faut savoir qu'il y a énormément à dire
sur les verrous, et que j'ai donc dû faire un sérieux tri des informations avant de rédiger ce chapitre. À nouveau, en cas de doute,
ou si vous avez besoin d'informations précises, je vous conseille vraiment de consulter la documentation officielle (si possible en
anglais, car elle est infiniment plus complète qu'en français).
Enfin, dernier avertissement : de nombreux changements dans l'implémentation des verrous sont advenus lors du développement
des dernières versions de MySQL. Aussi, la différence entre les verrous dans la version 5.0 et la version 5.5 est assez importante.
Tout ce que je présente dans ce chapitre concerne la version 5.5. Vérifiez bien votre version, et si vous consultez la
documentation officielle, prenez bien celle qui concerne votre propre version.
Modification de notre base de données
Nous allons ajouter deux tables à notre base de données, afin d'illustrer au mieux l'intérêt et l'utilisation des verrous : une table
Client, qui contiendra les coordonnées des clients de notre élevage, et une table Adoption, qui contiendra les renseignements
concernant les adoptions faites par nos clients.
Partie 5 : Sécuriser et automatiser ses actions
233/414
www.openclassrooms.com
Complément indispensable des transactions, les verrous permettent de sécuriser les requêtes en bloquant ponctuellement et
partiellement l'accès aux données.
Il s'agit d'un gros chapitre, avec beaucoup d'informations. Il y a par conséquent un maximum d'exemples pour vous aider à
comprendre le comportement des verrous selon les situations.
Au sommaire de ce chapitre :
Qu'est-ce qu'un verrou ?
Quel est le comportement par défaut de MySQL par rapport aux verrous ?
Quand et comment poser un verrou de table ?
Quand et comment poser un verrou de ligne ?
Comment modifier le comportement par défaut de MySQL ?
Principe
Lorsqu'une session MySQL pose un verrou sur un élément de la base de données, cela veut dire qu'il restreint, voire interdit,
l'accès à cet élément aux autres sessions MySQL qui voudraient y accéder.
Verrous de table et verrous de ligne
Il est possible de poser un verrou sur une table entière, ou seulement sur une ou plusieurs lignes d'une table. Étant donné
qu'un verrou empêche l'accès d'autres sessions, il est en général plus intéressant de poser un verrou sur la plus petite partie de la
base possible.
Par exemple, si l'on travaille avec les chiens de la table Animal.
On peut poser un verrou sur toute la table Animal. Dans ce cas, les autres sessions n'auront pas accès à cette table, tant
que le verrou sera posé. Qu'elles veuillent en utiliser les chiens, les chats, ou autre, tout leur sera refusé.
On peut aussi poser un verrou uniquement sur les lignes de la table qui contiennent des chiens. De cette manière, les
autres sessions pourront accéder aux chats, aux perroquets, etc. Elles pourront toujours travailler, tant qu'elles n'utilisent
pas les chiens.
Cette notion d'accès simultané aux données par plusieurs sessions différentes s'appelle la concurrence. Plus la concurrence est
possible, donc plus le nombre de sessions pouvant accéder aux données simultanément est grand, mieux c'est.
En effet, prenons l'exemple d'un site web. En général, on préfère permettre à plusieurs utilisateurs de surfer en même temps, sans
devoir attendre entre chaque action de pouvoir accéder aux informations chacun à son tour. Or, chaque utilisateur crée une
session chaque fois qu'il se connecte à la base de données (pour lire les informations ou les modifier).
Préférez donc (autant que possible) les verrous de ligne aux verrous de table !
Avertissements
Les informations données dans ce chapitre concernent exclusivement MySQL, et en particulier les tables utilisant les moteurs
MyISAM ou InnoDB (selon le type de verrou utilisé). En effet, les verrous sont implémentés différemment selon les SGDB, et
même selon le moteur de table en ce qui concerne MySQL. Si le principe général reste toujours le même, certains comportements
et certaines options peuvent différer d'une implémentation à l'autre. N'hésitez pas à vous renseigner plus avant.
Par ailleurs, je vous présente ici les principes généraux et les principales options, mais il faut savoir qu'il y a énormément à dire
sur les verrous, et que j'ai donc dû faire un sérieux tri des informations avant de rédiger ce chapitre. À nouveau, en cas de doute,
ou si vous avez besoin d'informations précises, je vous conseille vraiment de consulter la documentation officielle (si possible en
anglais, car elle est infiniment plus complète qu'en français).
Enfin, dernier avertissement : de nombreux changements dans l'implémentation des verrous sont advenus lors du développement
des dernières versions de MySQL. Aussi, la différence entre les verrous dans la version 5.0 et la version 5.5 est assez importante.
Tout ce que je présente dans ce chapitre concerne la version 5.5. Vérifiez bien votre version, et si vous consultez la
documentation officielle, prenez bien celle qui concerne votre propre version.
Modification de notre base de données
Nous allons ajouter deux tables à notre base de données, afin d'illustrer au mieux l'intérêt et l'utilisation des verrous : une table
Client, qui contiendra les coordonnées des clients de notre élevage, et une table Adoption, qui contiendra les renseignements
concernant les adoptions faites par nos clients.
Partie 5 : Sécuriser et automatiser ses actions
233/414
www.openclassrooms.com
