Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Cet article Source: GitHub · Cliquez ici || GitEE · Cliquez ici

Tout d'abord, le concept Introduction à la serrure

1, la description de base

fonction de base de mécanisme de verrouillage est utilisé pour coordonner l'accès simultané aux mêmes ressources, aborder la question des ressources sur plusieurs sessions multithreading. Mécanisme de verrouillage est un très grands modules, mettre en difficulté MySQL de plusieurs modules de base: l'indexation, le mécanisme de verrouillage, la transaction. Voici une démonstration basée MySQL5.6 plusieurs scénarios typiques, cette fois à travers les quelques problèmes MySQL, certains analystes traitent et l'idée est plus cruciale. Les concepts communs dans les serrures MySQL: verrous partagés pour lire, serrures d'écriture exclusives; serrures de table, verrous de ligne, l'écart de verrouillage.

2, le moteur de stockage et de verrouillage

  • moteur MyISAM: les deux modes de lecture et d'écriture, verrouillage de la table de support;
  • moteur InnoDB: supports de verrou en écriture au niveau des lignes, gap interbancaire de verrouillage, appuie verrou de table InnoDB;

3, l'API opération de verrouillage

  • BLOCAGE TABLE nom [LIRE, ECRIRE]; 加 表 锁
  • UNLOCK TABLES; libération par la norme

Deux, le mécanisme de verrouillage MyISAM

1, la description de base

MySQL verrouillage de niveau table comporte deux modes: verrous partagés en lecture (lecture-Lock) et serrures d'écriture exclusives (Write-Lock). Pour table de lecture MyISAM opérations, les autres threads ne bloque pas les requêtes de lecture pour la même table, mais le blocage des requêtes d'écriture à la même table, pour les tables MyISAM opération d'écriture et peuvent bloquer les autres threads pour lire et écrire la même opération de table, moteur MyISAM entre les opérations de lecture et d'écriture, et entre les opérations d'écriture et d'écriture sont sérialisés. Après un fil de conversation un verrou d'écriture sur une table, seul le fil de conversation courant de maintien de la serrure peut fonctionner sur la table. D'autres sujets lus et les opérations d'écriture attendront jusqu'à ce que le verrou soit libéré.

2, vérifier cas

Mécanisme de verrouillage de table sur la base des caractéristiques de ce qui précède, la vérification des deux cas suivants.

  • La structure de table sous-jacente
CREATE TABLE `dc_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表';
CREATE TABLE `dc_user_info` (
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `city` varchar(20) DEFAULT NULL COMMENT '城市',
  `country` varchar(20) DEFAULT NULL COMMENT '国家',
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  • serrures lecture partagée

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Une fenêtre de conversation

-- 1、加读锁
LOCK TABLE dc_user READ ;
-- 2、当前会话查询,OK
SELECT * FROM dc_user ;
-- 4、当前会话写入,Error
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 6、查询其他表,Error
SELECT * FROM dc_user_info ;
-- 7、释放锁
UNLOCK TABLES ;

Session Fenêtre Deux

-- 3、其他会话查询,OK
SELECT * FROM dc_user ;
-- 5、其他会话写入,Error
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 8、再次执行写入读取,OK
INSERT INTO dc_user (user_name,tell_phone) VALUES ('lock01','13267788998');
SELECT * FROM dc_user ;

Ici mécanisme de vérification table partagée verrous de lecture.

  • serrures d'écriture exclusives

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Ici, la vérification verrou de table mécanisme exclusif d'écriture.

  • contention de verrouillage des requêtes

Voir configuré dans la déclaration suivante,

show status like 'table%';

Table_locks_waited plus plus grave la valeur, l'affirmation de verrouillage, plus l'efficacité est faible.

3, numéro écritures simultanées

Pour écrire des verrous exclusifs nouveau cas de test Description: Dans certaines conditions, les requêtes de tables MyISAM et prend également en charge l'insertion de l'exécution simultanée. Les valeurs [0,1,2] En configurant les variables système concurrent_insert, écritures simultanées peuvent être atteints.

  • concurrent_insert = 0, interdit les écritures concurrentes;
  • concurrent_insert = 1, la configuration par défaut AUTO, aucun vide tables MyISAM, à savoir, la table intermédiaire aucune ligne sont supprimés, par exemple, [2,3], après élimination de 2 [1, 3], en même temps permet à la lecture des compteurs , un autre thread écrit le dossier final de la table.
  • concurrent_insert = 2, s'il n'y a pas table vide, permettre des insertions simultanées dans le dossier de la remorque.
    Dans l'exemple suivant, SESSION_1 obtenir une table de verrouillage LOCAL READ, le fil peut interroger des opérations sur la table, mais pas sur les opérations de mise à jour de table, d' autres fils (session_2), bien qu'il ne soit pas sur la table de suppression et de mise à jour, mais peut être opération d'insertion simultanée sur la table, la table est supposé ici que la cavité intermédiaire n'existe pas.

4, les questions prioritaires

moteur MyISAM à lire et verrous d'écriture sont mutuellement exclusives, il est une des opérations de lecture et d' écriture en série. Cependant, quand une demande d'opération de lecture et d' écriture simultanées, la priorité est accordée à la serrure de données d'écriture, ce mécanisme peut être configuré pour modifier les paramètres de configuration spécifiés à faible priorité-mises à jour, étant donné que le moteur MyISAM par défaut en tant que priorité revendiquée pour des demandes de lecture.
En exécutant la commande SET

  • LOW_PRIORITY_UPDATES = 1, de sorte que l'opération d'écriture de la session de priorité inférieure.
  • Spécifiez les INSERT, UPDATE, les déclarations d'attributs LOW_PRIORITY SUPPRIMER, ce qui réduit la priorité de la déclaration.

5, la demande de verrouillage de la table

problèmes de contrôle de cohérence des données, telles que le montant total des marchandises vendues + = surplus d'inventaire, alors que nous devrions vérifier en une seule séance alors que le tableau des commandes verrouillée et le tableau d'inventaire, donc afin de lire la table lorsque la table est disponible modifiée , entraînant une erreur de données.

Trois, mécanisme de verrouillage InnoDB

1, le concept de base Affaires

  • concept de transaction

Une transaction est une série d'opérations comme une seule unité logique de travail effectué (instructions SQL). Ces opérations réussissent ou non tous les succès.

  • propriétés ACID d'une transaction

Atomicité (atomicité) : une pluralité d'opérations dans une transaction soit réussir ou échouer

Cohérence (cohérence) : l'intégrité des données avant et après l'exécution de la transaction est cohérente

Isolation (Isolation) : dans le processus d'exécution des transactions, ne doit pas faire l' objet d'interférences provenant d' autres opérations

Persistante (Durabilité Rev) : Une fois que la fin de la transaction, les données de persistance pour la base de données

  • Affaires questions

Sale lecture : transaction A lit une autre transaction n'a pas présenté les données

lecture non reproductible : avant et après une transaction lit les mêmes données à plusieurs reprises, le contenu des données incohérentes, des scénarios de mise à jour d'émission

Dummy lecture (lecture magique) : lu plusieurs fois avant et après une transaction, le montant de l' incohérence des données, insérer problème de scène

  • Niveaux d'isolement

Lire les UNCOMMITTED : Les données de transaction peuvent être lus une autre transaction non validée.

commis Read : Transaction attendre une autre commits de transaction pour lire des données, résoudre lecture sale.

Lire répétable : lecture de données au début, transaction ouverte, opération de modification est plus permis, solution: lit sale, les lectures non reproductibles.

Serializable : plus haut niveau d'isolation des transactions, l'ordre de sérialisation des transactions d'exécution, pour résoudre lit sale, lecture non reproductible, lecture fantôme. Cependant la performance de base de données de consommation inefficace.

2, le mécanisme de verrouillage décrit

La plus grande différence InnoDB et MyISAM sont deux points: premièrement, pour soutenir l'opération de transaction, et d'autre part, au moyen d'un verrouillage au niveau des lignes. verrouillage de ligne et des verrous de niveau de table n'ont de nombreuses différences, en outre, l'introduction des affaires a également apporté de nouveaux problèmes: concurrence, impasse.

  • verrou partagé: également connu sous le nom d'un verrou de lecture. Il permet une transaction de lecture d'une ligne pour empêcher d'autres opérations pour obtenir les mêmes ensemble de données verrou exclusif. Si les objets de données de transaction T A plus verrou partagé, la transaction T peut être lue mais non modifiée A A, et les seules autres questions A poser un verrou, et ne peut en écriture verrouillé jusqu'à ce que les T versions partagées des verrous sur A. Cela garantit que d'autres transactions peuvent être lus A, mais pas apporter de modifications avant le verrou du T A S sur A.

  • verrou exclusif: également connu sous le verrou d'écriture. Permettent d'obtenir une mise à jour des données de transaction verrou exclusif, ce qui empêche d'autres transactions pour obtenir les mêmes ressources partagées verrous de lecture et des verrous exclusifs. Si l'objet de données transaction A à T plus un verrou d'écriture, vous pouvez lire une transaction T peut également modifier A, d'autres opérations ne peuvent pas être ajoutées à une serrure A jusqu'à ce que le verrou d'écriture de libération de T sur A.

3. Vérifier cas

  • La structure de table sous-jacente
CREATE TABLE `dc_user_in01` (
  `id` int(11) DEFAULT NULL COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

CREATE TABLE `dc_user_in02` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `tell_phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='用户表';

注意结构: Tableau dc_user_in01 pas d'index de clé primaire. Tableau dc_user_in02 ont un indice de clé primaire, mais utilise le moteur de stockage InnoDB, vérifiez le cas suivant sera différent.

  • Aucune table de structure d'index

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Une fenêtre de conversation

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=1,OK
SELECT * FROM dc_user_in01 WHERE id=1 ;
-- 3、添加写锁失败
SELECT * FROM dc_user_in01 
WHERE id=1 FOR UPDATE ;
-- 4、恢复事务提交
SET AUTOCOMMIT = 1 ;

Session Fenêtre Deux

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=2,OK
SELECT * FROM dc_user_in01 WHERE id=2 ;
-- 3、写入失败(等待)
INSERT INTO dc_user_in01 (id,user_name,tell_phone) 
VALUES (3,'lock01','13267788998');
-- 4、写锁失败(等待)
SELECT * FROM dc_user_in01 
WHERE id=2 FOR UPDATE ;
-- 5、恢复事务提交
SET AUTOCOMMIT=1 ;
  • Table structure d'index

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Une fenêtre de conversation

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=1,OK
SELECT * FROM dc_user_in02 WHERE id=1 ;
-- 3、添加写锁成功
SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ;
-- 执行到这里,再执行窗口2
-- 4、恢复事务提交
SET AUTOCOMMIT = 1 ;

Session Fenêtre Deux

-- 1、关闭自动提交
SET AUTOCOMMIT = 0 ;
-- 2、查询id=2,OK
SELECT * FROM dc_user_in02 WHERE id=2 ;
-- 3、查询id=1,OK,加读锁
SELECT * FROM dc_user_in02 WHERE id=1 ;
-- 4、写入成功
INSERT INTO dc_user_in02 (user_name,tell_phone) VALUES ('lock01','13267788998');
-- 5、加写锁成功,id为2的
SELECT * FROM dc_user_in02 
WHERE id=2 FOR UPDATE ;
-- 6、加写锁失败(等待),占用id为1的
SELECT * FROM dc_user_in02 WHERE id=1 FOR UPDATE ;
-- 7、恢复事务提交
SET AUTOCOMMIT=1 ;
  • échecs Index

Ici, nous devons prêter attention à savoir si l'utilisation de l'indice, dans de nombreuses requêtes, l'indice peut être dû à diverses raisons ne sont pas exécutées.

explain SELECT * FROM dc_user_in02 WHERE id=1 ;
  • contention de verrouillage des requêtes
show status like 'innodb_row_lock%';

Plus la valeur Innodb_row_lock_waits et Innodb_row_lock_time_avg, l'affirmation de verrouillage plus grave, plus l'efficacité est faible.

4, Next-Key 锁

  • documentation officielle

Afin d'éviter lecture fantôme, InnoDB en utilisant un algorithme appelé verrouillé clé suivante et l'écart enregistrera le verrouillage ensemble à savoir le verrouillage: InnoDB verrous de niveau ligne dans la mise en œuvre, il sera de cette façon - index balayage enregistrement, seront les enregistrements qui répondent aux critères d'index partagés serrures ou verrous exclusifs.

[Next-Key]=[Record-lock]+[Gap-lock]

Si le mécanisme ci-dessus plusieurs de verrouillage donne l'impression que laisse un, que l'algorithme de clé suivante sera suspecte de la vie.

  • vérifier cas

Ici confirmer principalement la présence de l'écart mécanisme Gap-verrouillage de la serrure.

CREATE TABLE `dc_gap` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `id_index` int(11) NOT NULL COMMENT 'index',
  PRIMARY KEY (`id`),
  KEY `id_index` (`id_index`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='间隙表';
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('1', '2');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('3', '4');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('6', '7');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('8', '7');
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('9', '9');

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Une fenêtre de conversation

-- 1、开始事务
START TRANSACTION ;
-- 3、锁定id_index=7的两条记录
SELECT * FROM dc_gap 
WHERE id_index=7 FOR UPDATE ;
-- 9、提交
COMMIT ;

Session Fenêtre Deux

-- 2、开始事务
START TRANSACTION ;
-- 4、写入等待,id_index=6
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('4', '6');
-- 5、写入等待,id_index=4
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('4', '4');
-- 6、写入成功,id_index=3
INSERT INTO `dc_gap` (`id`, `id_index`) 
VALUES ('4', '3');
-- 7、写入等待,id_index=9
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('7', '9');
-- 8、写入成功,id_index=10
INSERT INTO `dc_gap` (`id`, `id_index`) VALUES ('7', '10');

4 jusqu'à la fente 7, 7 vers le bas dans la fente 9, le verrouillage de l'écart [4,9], et contient des valeurs inclus.

5, Mort-Lock 锁

  • Description de base

Deux ou plusieurs transactions sur les mêmes ressources que chaque occupation, et les autres demandes de verrouillage des ressources occupés, ce qui entraîne un phénomène de boucle infinie, qui est une impasse.

  • vérifier cas

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Une fenêtre de conversation

-- 1、开启事务
START TRANSACTION ;
-- 3、占用id=6的资源
SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ;
-- 5、占用id=9的资源等待
SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ;

Session Fenêtre Deux

-- 2、开启事务
START TRANSACTION ;
-- 4、占用id=9的资源
SELECT * FROM dc_gap WHERE id=9 FOR UPDATE ;
-- 6、占用id=6的资源抛死锁
SELECT * FROM dc_gap WHERE id=6 FOR UPDATE ;

补刀一句: Atteignez une variété de mécanismes de détection de blocage de la base de données, ou attendre le délai de blocage final, le moteur de stockage InnoDB après une impasse est détectée, une erreur est renvoyée immédiatement, sinon la transaction va changer dans deux premiers, à la recherche, un million d'années.

注意: Deadlock dans les affaires transactionnel, ne peut pas être évité absolument, moins de ressources de verrouillage, taille de particules fines, essayez d'éviter cette situation.

Quatrièmement, l'adresse source

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

Notions de base MySQL (06): gestion des transactions, cas de mécanisme de verrouillage détaillé

Je suppose que tu aimes

Origine blog.51cto.com/14439672/2479882
conseillé
Classement