Le principe MySQL MVCC révélé : Comment gérer les conflits de lecture et d'écriture dans les transactions simultanées ?
Introduction :
Dans un système de base de données, l'exécution simultanée des transactions est essentielle. Cependant, l’exécution simultanée entraîne également une série de problèmes, parmi lesquels les conflits de lecture et d’écriture. Lorsque plusieurs transactions lisent et écrivent les mêmes données en même temps, des incohérences peuvent survenir. Pour résoudre ce problème, MySQL a introduit le mécanisme de contrôle de concurrence multiversion (MVCC). Cet article révélera le principe de MVCC et analysera en détail comment MySQL gère les conflits de lecture et d'écriture dans les transactions simultanées.
a) Si le numéro de version de création de la ligne de données est supérieur à l'heure de début de la transaction, cela signifie que la ligne de données a été créée plus tard, alors cette transaction n'est pas visible.
b) Si le numéro de version supprimé de la ligne de données est inférieur ou égal à l'heure de début de la transaction, cela signifie que la ligne de données a été supprimée, et alors cette transaction n'est pas visible.
c) Si le numéro de version de création de la ligne de données est inférieur ou égal à l'heure de début de la transaction, et que le numéro de version de suppression est supérieur à l'heure de début de la transaction ou est vide, alors cette transaction est visible.
Grâce aux règles ci-dessus, une transaction peut lire les données qui ont été soumises avant son démarrage, mais les données non validées et les données modifiées par d'autres transactions en cours d'exécution sont invisibles.
a) Si la transaction A souhaite modifier la ligne de données, mais que la ligne de données a été modifiée par une autre transaction B (c'est-à-dire que le numéro de version ne correspond pas), alors la transaction A le fera revenez en arrière et une erreur sera signalée indiquant un conflit d’opération d’écriture.
b) Si une transaction souhaite supprimer une ligne de données, mais que la ligne de données a été modifiée par une autre transaction (c'est-à-dire que le numéro de version ne correspond pas), alors la transaction créera une nouvelle version de la ligne de données et définira le marque de suppression au numéro de version de la transaction en cours.
c) Si la ligne de données à modifier ou à supprimer par la transaction n'existe pas (c'est-à-dire que le numéro de version est vide), la transaction créera une nouvelle version de la ligne de données et le numéro de version sera défini sur la version numéro de la transaction en cours.
Grâce aux méthodes de traitement ci-dessus, MySQL garantit que les opérations d'écriture de transactions ne provoqueront pas de conflits ni d'incohérences de données.
Exemple de code :
Afin de mieux comprendre le principe de MySQL MVCC, un exemple de code est donné ci-dessous pour démontrer le processus de traitement en cas de conflits de lecture et d'écriture dans des transactions simultanées.
-- 创建测试表 CREATE TABLE test ( id INT PRIMARY KEY, value VARCHAR(20) NOT NULL, version INT NOT NULL ); -- 插入测试数据 INSERT INTO test (id, value, version) VALUES (1, 'A', 1);
-- 事务1:读操作 START TRANSACTION; SELECT * FROM test WHERE id = 1; -- 结果:id=1, value='A', version=1
-- 事务2:写操作 START TRANSACTION; -- 修改数据行,并将version+1 UPDATE test SET value = 'B', version = version + 1 WHERE id = 1; -- 提交事务 COMMIT;
-- 事务1:再次读操作 SELECT * FROM test WHERE id = 1; -- 结果:id=1, value='B', version=2
Grâce à l'exemple de code ci-dessus, vous pouvez voir qu'après que la transaction 2 a modifié la ligne de données, lorsque la transaction 1 lit à nouveau les données, la ligne de données modifiée a été lue et la valeur de version a été mise à jour pour garantir la cohérence des données.
Conclusion :
Le mécanisme MVCC de MySQL résout les conflits de lecture et d'écriture des transactions simultanées grâce au jugement et au traitement des numéros de version. En comparant l'heure de début de la transaction, le numéro de version de l'instantané et le numéro de version de la ligne de données, MySQL parvient à l'isolation et à la cohérence des données. Dans les applications pratiques, l'utilisation rationnelle du mécanisme MVCC peut améliorer la concurrence et les performances de la base de données.
Référence :
[1] https://dev.mysql.com/doc/refman/8.0/en/innodb-multi-versioning.html
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!