Transactions basées sur MySQL

Prenez l'habitude d'écrire ensemble ! C'est le 9ème jour de ma participation au "Nuggets Daily New Plan · April Update Challenge", cliquez pour voir les détails de l'événement .

Une transaction est un ensemble d'opérations, qui est une unité de travail indivisible. Une transaction soumet ou annule des demandes d'opération au système dans son ensemble, c'est-à-dire que ces opérations réussissent ou échouent en même temps.

Par exemple : Zhang San transfère 1 000 yuans à Li Si, l'argent sur le compte bancaire de Zhang San est réduit de 1 000 et l'argent sur le compte bancaire de Li Si est augmenté de 1 000.

Cet ensemble d'opérations doit se trouver dans la portée d'une transaction, soit toutes réussissent, soit toutes échouent.

Situation normale : l'opération de transfert doit être effectuée selon les trois étapes suivantes. Une fois les trois étapes terminées, Zhang San diminue de 1 000, tandis que Li Si augmente de 1 000, et le transfert est réussi :

Situation anormale : l'opération de transfert est également divisée en trois étapes à effectuer : dans la troisième étape, une erreur est signalée, ce qui oblige Zhang San à réduire de 1 000 yuans, tandis que le montant de Li Si ne change pas, ce qui entraîne une corruption des données. S'il ne correspond pas, il y a un problème. 

Afin de résoudre les problèmes ci-dessus, nous devons terminer la transaction via les données. Nous avons seulement besoin d'ouvrir la transaction avant l'exécution de la logique métier et de soumettre la transaction une fois l'exécution terminée. Si une erreur est signalée pendant l'exécution, la transaction est annulée et les données sont restaurées à l'état avant le démarrage de la transaction.

Remarque : la transaction MySQL par défaut est automatiquement validée, c'est-à-dire que lorsqu'une instruction DML est exécutée, MySQL validera immédiatement et implicitement la transaction

1. Opération transactionnelle

Script de base de données : 

drop table if exists account;
create table account
(
    id    int primary key AUTO_INCREMENT comment 'ID',
    name  varchar(10) comment '姓名',
    money double(10, 2) comment '余额'
) comment '账户表';
insert into account(name, money)
VALUES ('张三', 2000),
       ('李四', 2000);
复制代码

1.1 Transactions non contrôlées

1. Testez la situation normale

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三';
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四';
复制代码

Une fois le test terminé, vérifiez l'état des données, vous pouvez voir que l'opération de données est cohérente avant et après

2. Testez les exceptions

-- 1. 查询张三余额
select * from account where name = '张三';
-- 2. 张三的余额减少1000
update account set money = money - 1000 where name = '张三'; 出错了....
-- 3. 李四的余额增加1000
update account set money = money + 1000 where name = '李四'
复制代码

Nous restaurons les données à 2000, puis exécutons à nouveau l'instruction SQL ci-dessus (erreur... Cette phrase n'est pas conforme à la syntaxe SQL, et une erreur sera signalée lors de l'exécution), vérifions la situation finale des données et constatons que les données sont incohérentes avant et après la durée de l'opération

1.2 Contrôle de la première transaction

1. Afficher/définir la méthode de soumission des transactions

SELECT @@autocommit ; 

SET @@autocommit = 0 ;
复制代码

2. Soumettre la transaction

COMMIT;
复制代码

3. Annuler la transaction

ROLLBACK;
复制代码

Avis:

Dans la méthode ci-dessus, nous avons modifié le comportement de validation automatique de la transaction et changé la validation automatique par défaut en validation manuelle. À ce stade, aucune des instructions DML que nous exécutons ne sera validée et nous devons exécuter manuellement la validation pour valider .

1.3 Opération de contrôle 2

1. Démarrer une entreprise

START TRANSACTION 或 BEGIN ;
复制代码

2. Soumettre la transaction

COMMIT;
复制代码

3. Annuler la transaction

ROLLBACK;
复制代码

Boîte de transfert:

-- 开启事务 
start transaction 
-- 1. 查询张三余额 
select * from account where name = '张三'; 
-- 2. 张三的余额减少1000 
update account set money = money - 1000 where name = '张三'; 
-- 3. 李四的余额增加1000 
update account set money = money + 1000 where name = '李四'; 
-- 如果正常执行完毕, 则提交事务 
commit; 
-- 如果执行过程中报错, 则回滚事务 
-- rollback;
复制代码

2. Quatre caractéristiques des transactions

  1. Atomicité : une transaction est la plus petite unité d'opération indivisible, soit toutes réussissent, soit toutes échouent.

  2. Cohérence : lorsqu'une transaction se termine, toutes les données doivent être dans un état cohérent.

  3. Isolation : le mécanisme d'isolation fourni par le système de base de données garantit que les transactions s'exécutent dans un environnement indépendant qui n'est pas affecté par des opérations simultanées externes.

  4. Durabilité : une fois qu'une transaction est validée ou annulée, ses modifications apportées aux données de la base de données sont permanentes.

Ce qui précède sont les quatre caractéristiques des transactions, appelées ACID.

3. Problèmes de transaction simultanés

1. Dirty read : une transaction lit des données qui n'ont pas encore été validées par une autre transaction.

2. Lecture non répétable : Une transaction lit successivement le même enregistrement, mais les données lues deux fois sont différentes, ce qui est appelé lecture non répétable.

3. Lecture fantôme : lorsqu'une transaction interroge des données selon des conditions, il n'y a pas de ligne de données correspondante, mais lors de l'insertion de données, on constate que cette ligne de données existe déjà, comme s'il y avait un "fantôme".

4. Niveau d'isolement des transactions

Afin de résoudre les problèmes causés par les transactions concurrentes, le niveau d'isolation des transactions a été introduit dans la base de données. Il s'agit principalement des éléments suivants :

1. Vérifiez le niveau d'isolement de la transaction

SELECT @@TRANSACTION_ISOLATION; 1
复制代码

2. Définir le niveau d'isolement des transactions

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 
{ READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }
复制代码

Remarque : Plus le niveau d'isolation des transactions est élevé, plus les données sont sécurisées, mais plus les performances sont faibles.

Je suppose que tu aimes

Origine juejin.im/post/7084569974215278623
conseillé
Classement