Votre commentaire insuffisance @Transaction encore?

introduction

Dans le projet, nous allons souvent utiliser l'annotation @Transaction pour le contrôle des transactions, mais parfois inexplicable sans ce contrôle de transaction ne fonctionne pas, lors de l'entrevue, l'intervieweur pourrait demander @Transaction commentaire Dans quelles circonstances échoueraient? Aujourd'hui, je viens Je vois un article écrit à ce sujet, donc nous trions.

Une transaction

Nous savons que le printemps à réaliser dans le cadre du contrôle des transactions, nous avons deux façons. D' abord, [ le contrôle programmatique des transactions ], deuxième [ contrôle des transactions déclarative ].

[ Contrôle des transactions Programmatic ]

Concept: Comme son nom l'indique, est ce que nous pouvons contrôler la transaction de code de programmation

Inconvénients: Code de très invasifs

exemple:

essayez {
     // TODO quelque chose 
     transactionManager.commit (état); 
} Captures (Exception e) { 
    transactionManager.rollback (état); 
    lancer de  nouveaux InvoiceApplyException ( "异常失败" ); 
}

[ Contrôle des transactions déclarative ]

Concept: Basé sur Orientée Aspect AOP, et il sera transaction spécifique d'affaires découplage partiel.

Avantages: le contrôle des transactions de découplage Code Code et notre activité spécifique, le code, moins invasive. Par conséquent, le processus de développement réel, cette approche est la plus utilisée. déclarative des transactions, il y a deux façons, on est basé sur le fichier de configuration XML et le mode TX de l' AOP , le second est basé sur le commentaire @Transaction

Deux, @ l'introduction de la transaction

  1. @ annotation de transaction peut être utilisée à la place

    @Transaction peut agir interfaces, classes, méthodes de classe

  • Classe d'action: les méthodes de la classe publique sont configurés avec les mêmes informations d'attribut de transaction.
  • Le rôle des méthodes de classe: configuration de classe lorsqu'un @Transaction, la méthode configure également @Transaction, la transaction remplacera la méthode de classe d'informations de configuration de transaction
  • Interface Rôle: Cette méthode est déconseillée, car une fois marqué sur l'interface et configuration Spring AOP en utilisant Cglib de proxy dynamique, conduira à commentaire @Transaction échec  
@Transactional 
 @RestController 
 @RequestMapping 
 publique  classe MybatisPlusController { 
     @Autowired 
     privée CityInfoDictMapper cityInfoDictMapper; 
 
     @Transactional (rollbackFor . = Exception de classe ) 
     @GetMapping ( "/ test" )
     publique test String () lance Exception { 
        CityInfoDict cityInfoDict = nouvelle CityInfoDict (); 
        cityInfoDict.setParentCityId ( 2 ); 
        cityInfoDict.setCityName ( "2" ); 
        cityInfoDict.setCityLevel ( "2"); 
        cityInfoDict.setCityCode ( "2" );
        int insert = cityInfoDictMapper.insert (cityInfoDict);
        retour insert + "" ; 
    } 
}

2. Propriétés de transaction @

①propagation

comportement de propagation de propagation au nom de la transaction. La valeur par défaut Propagation.REQUIRED.

 

Propagation.REQUIRED: Si la transaction en cours existe, il est ajouté à la transaction, si la transaction n'existe pas actuellement, créez une nouvelle transaction (qui est, si A et méthodes B sont des méthodes pour ajouter des annotations dans le mode de propagation par défaut, une méthode. appel interne B, la transaction va fusionner les deux méthodes d'une transaction)

Propagation.SUPPORTS: Si la transaction en cours existe, il est ajouté à la transaction, si la transaction n'existe pas actuellement, la manière non transactionnelle de continuer à fonctionner

Propagation.MANDATORY: Si la transaction en cours existe, il est ajouté à la transaction, si la transaction n'existe pas, une exception est levée.

Propagation.REQUIRES_NEW: recréer une nouvelle transaction, si la transaction existe actuellement, de suspendre la transaction en cours (méthode A dans un mode par défaut actuel Propagation.REQUIRED, b plus la méthode du mode classe B Propagation.REQUIRES_NEW employé, alors. un appel de méthode b méthode pour exploiter la base de données, mais après une méthode lance une exception, la méthode b ne roule pas une transaction sera suspendue parce que la méthode Propagation.REQUIRES_NEW)

Propagation.NOT_SUPPORTED: à titre d'opération non transactionnelle, si la transaction en cours existe, suspendre la transaction en cours

Propagation.NEVER: à titre d'opération non transactionnelle, si existe la transaction en cours, une exception est levée

Propagation.NESTED: et Propagation.REQUIRED le même effet.

propriété ②isolation

isolement: niveau d'isolement de la transaction

propriété ③timeout

délai d'attente de transaction, la valeur par défaut est -1. Si la transaction dépasse la limite de temps n'a pas encore été complétée, la restauration automatique.

propriété ④readOnly

Indiquez si la transaction est des transactions en lecture seule, la valeur par défaut est fausse, méthode qui ne nécessite pas la transaction d'ignorer, telles que les données de lecture, peut être définie sur true

⑤rollbackFor propriété

Il est utilisé pour spécifier le type de transaction rollback peut déclencher une exception, vous pouvez spécifier plusieurs types d'exception

⑥noRollbackFor propriété

Indique le type d'exception est levée, la transaction ne changera pas, vous pouvez également spécifier plusieurs types d'exception.

Trois, @ scénarios d'échec transaction

① appliquée aux méthodes publiques non modifiés. La raison en est que l'agent de défaillance Spring AOP est, comme représenté, TransactionInterceptor (transaction intercepteur) à la cible d'interception avant et après l'exécution de la méthode, DynamicAdvisedInterceptor (CglibAopProxy classe interne) Méthode d'interception JDKDynamicAopProxy ou méthode indirecte invocation appelle la méthode computeTransactionAttribute AbstractFallbackTransactionAttributeSource d'obtenir des informations de configuration de transaction d'annotation de transaction.

protégé TransactionAttribute computeTransactionAttribute (méthode méthode, 
    classe <?> targetClass) {
         // Ne laissez pas les pas publiques les méthodes selon les besoins. 
        si (allowPublicMethodsOnly () &&! Modifier.isPublic (method.getModifiers ())) {
         retour  null ; 
}

Cette méthode vérifie les modificateurs de méthode cible lorsque public les informations de configuration, et non le public ne sera pas @Transaction de la propriété.

② attribut d'annotation propriétés de propagation d'erreur.

Si la configuration suivante trois attributs de propagation = valeur d'attribut, aucune transaction pour annulation.

TransactionDefinition.PROPAGATION_SUPPORTS

TransactionDefinition.PROPAGATION_NOT_SUPPORTED

TransactionDefinition.PROPAGATION_NEVER

③rollbackFor erreur de réglage

rollbackFor prescription peut être spécifiée types d'exception rollback de transaction .Spring par défaut prodiguées non vérifiées exceptions non vérifiées (héritées de l'exception RuntimeException) ou erreur n'annuler la transaction, d'autres exception des prescriptions ne roule pas la transaction, si elles sont lancées dans une transaction d'autres types d'exceptions, mais ils peuvent s'attendre rouleau de printemps la transaction, vous devez spécifier la propriété rollbackFor.

Si jeté dans la méthode cible dans une sous-classe de la transaction sera également annulée, spécifiée rollbackFor anormale anormale.

privé  int getDepth (classe <?> exceptionClass, int profondeur) {
          si (exceptionClass.getName (). contient ( ce .exceptionName)) {
              // trouvé! 
             retourner la profondeur; 
 } 
         // Si nous sommes allés aussi loin que nous pouvons aller et nous avons pas trouvé ... 
         si (exceptionClass == Throwable. Classe ) {
              retour -1 ; 
} 
Retourner getDepth (exceptionClass.getSuperclass (), la profondeur + 1 ); 
}

④ appeler la même méthode dans une classe, ce qui @Transaction échec

Par exemple, il y a un test de classe, il est une méthode A, A et ensuite appeler ce type de méthode B (quelle que soit la méthode B est la modification publique ou privée), lorsque la méthode est pas déclarée affaires d'annotation, alors que les méthodes B, après la méthode A est la queue d'appel, méthode de transaction B ne fonctionne pas. c'est parce que l'utilisation de proxy ressort AOP a causé, parce que lorsque la méthode de transaction est appelée la classe actuelle que le code aura un objet proxy ressort généré par la direction.

⑤ exception vos prises « manger » plomb @Transaction à l'échec.

Cette situation est le type le plus commun de scénarios de défaillance @Transaction de commentaire

     @Transactional
      Private Entier A () lance Exception {
          int INSERT = 0 ;
          try { 
             CityInfoDict cityInfoDict = new new (CityInfoDict); 
             cityInfoDict.setCityName ( "2" ); 
             cityInfoDict.setParentCityId ( 2 );
              / ** 
              * 2 champ A est inséré données 
             * / 
            insert = cityInfoDictMapper.insert (cityInfoDict);
             / ** 
             * B 3 est inséré dans le champ de données 
             * / 
            b.insertB (); 
        }catch (Exception e) { 
            e.printStackTrace (); 
        } 
    }

Si la méthode interne B lancer une exception, mais cette tentative temps attraper une méthode de méthode anormale B, et que la transaction peut être annulée encore normal?

Réponse: Non!

会 抛出 异常: org.springframework.transaction.UnexpectedRollbackException: transaction a été annulée, car il a été marqué comme rollback seule

Parce que quand Serviceb jeté une exception plus tard, le besoin de Serviceb pour signer l'annulation de la transaction en cours. ServiceA en raison du temps vous capturez manuellement ce traitement d'exception, ServiceA que la transaction en cours doit engager à la normale. A cette époque, il y aura une incohérence, trop il est tel que la UnexceptedRollbackException avant lève une exception,

Le printemps est une transaction avant d'appeler le début d'une méthode commerciale est effectuée seulement après la finalise la méthode entreprise validation ou l'annulation, s'il est exécuté en fonction si une exception est levée runTime. Si vous jetez RuntimeException n'a pas pris à vos méthodes d'affaires, puis, la transaction est annulée.

Dans les méthodes commerciales ne sont généralement pas besoin d'attraper une exception, si vous devez attraper doivent être jetés throw new RuntimeException(), ou jeter un type d'annotation spécifiée d'exception @Transactional(rollbackFor=Exception.class), sinon il fera la transaction échouer, entraînant des données incohérentes valider les données, essayez donc parfois attraper le plutôt superflu.

moteur de base de données ne supporte pas les transactions

La probabilité que cela se produise est pas élevé, la transaction peut prendre effet moteur de base de données transactionnelles supports est la clé. Généralement utilisé transactions supports de base de données MySQL à l' aide de la valeur par défaut du innodbmoteur. Une fois que le moteur de base de données ne prend pas en charge le passage à une transaction myisam, cette transaction échouera fondamentalement.

[De ci-dessus] marcozheng numéro public, https: //mp.weixin.qq.com/s/enKOM3F_Xxg123HPMCFUPw et collationné.

 

Je suppose que tu aimes

Origine www.cnblogs.com/lovehunterYjj/p/12588532.html
conseillé
Classement