Avec le développement d'Internet et l'expansion continue des scénarios d'application, les exigences en matière de performances et de fiabilité du système sont de plus en plus élevées. Dans des scénarios commerciaux complexes, plusieurs services doivent souvent être exécutés de manière collaborative, ce qui nécessite le traitement de transactions distribuées. Cet article explique comment effectuer un traitement de transactions distribuées dans ThinkPHP6.
1. Le concept de base des transactions distribuées
1. Les transactions distribuées
Un système distribué fait référence à des programmes et des programmes sur plusieurs ordinateurs. connectés et communiqués via le réseau, et collaborer pour accomplir une certaine tâche. Dans ce cas, si plusieurs transactions doivent impliquer plusieurs ressources, une coordination des transactions distribuées est requise. Les transactions distribuées font référence aux transactions réalisées en collaboration par plusieurs transactions et doivent répondre aux propriétés ACID.
2.Attributs ACID
Dans la base de données, ACID fait référence aux quatre attributs que sont l'atomicité, la cohérence, l'isolement et la durabilité.
Atomicité : Fait référence au fait qu'une transaction est une unité de travail indivisible, soit complètement réalisée, soit pas réalisée du tout, et qu'il n'y a pas d'achèvement partiel.
Cohérence : fait référence à l'état de la base de données qui doit rester cohérent avant et après l'exécution de la transaction. Par exemple, dans une transaction de transfert, la somme des soldes des comptes reste inchangée avant et après le transfert. exécuté.
Isolement : fait référence au cas où plusieurs transactions sont exécutées en parallèle, l'exécution d'une transaction ne doit pas être interférée par d'autres transactions.
Durabilité : fait référence au fait qu'une fois qu'une transaction est soumise, ses résultats doivent être stockés en permanence dans la base de données.
2. Implémentation des transactions distribuées dans ThinkPHP6
1. Problèmes avec les transactions distribuées
Dans les bases de données relationnelles traditionnelles, les transactions distribuées La mise en œuvre des transactions nécessite L'utilisation du protocole de validation en deux phases (2PC), mais cette méthode présente certains problèmes, tels que des points de défaillance uniques, des goulots d'étranglement dans les performances, etc. Par conséquent, dans les scénarios d’applications Big Data et à haute concurrence, d’autres méthodes doivent être utilisées pour mettre en œuvre des transactions distribuées.
2. Solution de transaction distribuée
Pour le traitement des transactions distribuées dans ThinkPHP6, vous pouvez utiliser le middleware open source Seata qui divise l'application en trois rôles. Coordinateur), TM (Transaction Manager) et RM (Resource Manager) :
TC (Transaction Coordination) : Coordinateur de transactions, chargé de coordonner les ressources et les ressources du module de transaction distribué. Atteindre la cohérence transactionnelle.
TM (Transaction Manager) : Gestionnaire de transactions, responsable des opérations liées aux transactions telles que l'ouverture, la soumission, le rollback, etc.
RM (Resource Manager) : Gestionnaire de ressources, responsable de la gestion des ressources, telles que les opérations de base de données, les opérations MQ, etc.
3. Utilisation de Seata
Avant d'utiliser Seata, vous devez d'abord installer et configurer Seata, y compris créer TC, RM et d'autres ressources. Une fois l'installation et la configuration terminées, vous pouvez utiliser Seata pour traiter les transactions distribuées. Les étapes spécifiques sont les suivantes :
(1) Présentez la bibliothèque de dépendances de Seata
<!-- seata依赖库 --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-all</artifactId> <version>${seata.version}</version> </dependency>
(2). ) Configurer le fichier Seata
Dans les modules qui nécessitent des transactions distribuées, vous devez ajouter la configuration suivante dans application.properties :
# 配置seata的全局事务ID生成器 seata.tx-service-group=my_group # type,AT表示AT模式,XA表示XA模式 seata.tx-type=AT # 自动代理数据源 seata.autoproxy.datasource=true
(3) Au début de la transaction, Démarrage global
Au début de la transaction, un démarrage global est requis :
// 开启全局事务 GlobalTransactionContext.begin(transactionName);
(4) Utiliser RM dans la transaction
Utiliser dans le transaction Lorsque vous utilisez RM (comme le RDMS de base de données), vous devez utiliser l'agent fourni par Seata pour gérer les ressources :
// 使用代理获取connection conn = ((DataSourceProxy) dataSource).getConnection();
(5) À la fin de la transaction, effectuez un commit global #🎜🎜 #
dans la transaction À la fin, un commit global est requis :// 提交全局事务 GlobalTransactionContext.getCurrentOrCreate().commit();
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!