Maison >cadre php >PensezPHP >Comment effectuer un traitement de transactions distribuées dans ThinkPHP6 ?

Comment effectuer un traitement de transactions distribuées dans ThinkPHP6 ?

王林
王林original
2023-06-12 09:39:592085parcourir

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();

Parce que Seata encapsule le contenu des transactions distribuées dans le middleware, lorsque vous utilisez Seata, vous pouvez séparer la logique métier et la transaction distribuée traitement pour faciliter la gestion et la maintenance.

3. Résumé

Cet article combine ThinkPHP6 et le middleware Seata pour présenter le processus de transactions distribuées dans un système distribué et l'utilisation du middleware Seata. Dans les applications réelles, il est nécessaire de choisir entre performances et fiabilité en fonction de scénarios commerciaux spécifiques pour le traitement des transactions distribuées.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn