Maison  >  Article  >  Java  >  Explication détaillée d'exemples d'utilisation par Spring des annotations pour la configuration de la gestion des transactions

Explication détaillée d'exemples d'utilisation par Spring des annotations pour la configuration de la gestion des transactions

Y2J
Y2Joriginal
2017-05-02 11:47:471566parcourir

Cet article présente principalement l'utilisation par Spring des annotations pour la configuration de la gestion des transactions. L'éditeur pense que c'est assez bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur et jetons un coup d'œil

Étapes à utiliser :

Étape 1. Introduisez l'espace de noms cc2c39e2370aac9d3896793edbbe786f

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
 http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

Étape 2. Les beans avec les annotations @Transactional sont automatiquement configurés pour prendre en charge les transactions déclaratives

<!-- 事务管理器配置, Hibernate单数据源事务 -->
  <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
  </bean>
  
  <!-- 使用annotation定义事务 -->
  <tx:annotation-driven transaction-manager="defaultTransactionManager" proxy-target-class="true" />

Étape 3. Dans l'interface ou la classe Lors de la déclaration, écrivez un @Transactional.

Si vous l'écrivez uniquement sur l'interface, la classe d'implémentation de l'interface sera héritée. Les méthodes spécifiques de la classe d'implémentation de l'interface peuvent remplacer la. paramètres lors de la déclaration de classe


@Transactional //Annotations au niveau de la classe, applicables à toutes les méthodes publiques de la classe

Comportement de propagation des transactions et niveau d'isolement

Lorsque vous utilisez la gestion des transactions d'annotations de Spring, vous pouvez être un peu confus quant au comportement de propagation des transactions et au niveau d'isolement. Ce qui suit est une introduction détaillée pour une référence facile.

Méthode d'annotation d'objet : @Transactional

Lorsqu'elles sont marquées devant une classe, toutes les méthodes de la classe marquée effectuent un traitement de transaction, exemple :

@Transactional
public class TestServiceBean implements TestService {}
Lorsque certaines méthodes de la classe ne nécessitent pas de choses :

@Transactional
public class TestServiceBean implements TestService {  
  private TestDao dao;  
  public void setDao(TestDao dao) {
    this.dao = dao;
  }  
  @Transactional(propagation = Propagation.NOT_SUPPORTED)
  public List<Object> getAll() {
    return null;
  }  
}

Introduction au comportement de propagation des choses :

@Transactional(propagation=Propagation .REQUIRED )


S'il y a une transaction, alors rejoignez la transaction, sinon, créez-en une nouvelle (par défaut)


@Transactional(propagation=Propagation. NOT_SUPPORTED)


Le conteneur n'ouvre pas de transactions pour cette méthode


@Transactional(propagation=Propagation.REQUIRES_NEW)


Créer un nouveau transaction, qu'il y ait une transaction ou non. La suspension initiale, la nouvelle exécution est terminée et l'ancienne transaction continue de s'exécuter


@Transactional(propagation=Propagation.MANDATORY)


doit être dans une transaction existante Exécuter, sinon une exception sera levée


@Transactional(propagation=Propagation.NEVER)


doit être exécuté dans une transaction qui n'existe pas, sinon une exception sera levée (avec Propagation. OBLIGATOIRE (à la place)


@Transactional(propagation=Propagation.SUPPORTS)


Si autre les beans appellent cette méthode et déclarent les transactions dans d'autres beans, utilisez des transactions. Si Si les autres beans ne déclarent pas de transactions, alors il n'y a pas besoin de transactions

Paramètres de délai d'expiration des objets : .

@Transactional(timeout=30) //La valeur par défaut est de 30 secondes

Niveau d'isolement des transactions :


@Transactional(isolation = Isolation.READ_UNCOMMITTED)


Lire les données non validées (des lectures sales, des lectures non répétables se produiront)) En gros, n'utilisez pas


@Transactional(isolation = Isolation.READ_COMMITTED)


pour lire les données soumises (des lectures non répétables et des lectures fantômes se produiront)


@Transactional(isolation = Isolation.REPEATABLE_READ)


Lecture répétable (lecture fantôme se produira)


@Transactional(isolation = Isolation.SERIALIZABLE)


Sérialisation

MYSQL : la valeur par défaut est le niveau REPEATABLE_READ


SQLSERVER : la valeur par défaut est READ_COMMITTED

Lecture sale : lecture d'une transaction Obtenez les données de mise à jour non validées d'une autre transaction


Lecture non répétable : dans la même transaction, les résultats renvoyés par la lecture les mêmes données plusieurs fois sont différentes, en d'autres termes,


Les lectures ultérieures peuvent lire les données mises à jour qui ont été soumises par une autre transaction. Au contraire, la "lecture répétable" peut garantir que lors de la lecture de données multiples. fois dans la même transaction


Les données sont les mêmes, c'est-à-dire que les lectures suivantes ne peuvent pas lire les données mises à jour soumises par une autre transaction


Lecture fantôme : une transaction lit les données d'insertion soumis par une autre transaction

@ Description des paramètres couramment utilisés dans les annotations transactionnelles

Nom du paramètre

参 数 名 称

功 能 描 述

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

Description de la fonction
readOnly Cet attribut est utilisé pour définir si la transaction en cours est une transaction en lecture seule. Définissez sur true pour indiquer une lecture seule, false pour indiquer une lecture-écriture. Par exemple : @Transactional(readOnly=true)
rollbackFor Cet attribut est utilisé pour définir le requis Un tableau de classes d'exceptions pour l'annulation Lorsqu'une exception dans le tableau d'exceptions spécifié est levée dans la méthode, la transaction sera annulée. Par exemple : Spécifiez une seule classe d'exception : @Transactional(rollbackFor=RuntimeException.class)Spécifiez plusieurs classes d'exception : @Transactional(rollbackFor={RuntimeException.class, Exception.class})

Tableau suite)

noRollbackForClassName

参 数 名 称

功 能 描 述

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为,具体取值可参考表6-7。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

Nom du paramètre
Description de la fonction
rollbackForClassName Cet attribut est utilisé pour définir le tableau des noms de classes d'exception qui nécessitent à annuler, lorsqu'une exception dans le tableau de noms d'exception spécifié est levée dans la méthode, la transaction sera annulée. Par exemple : Spécifiez un seul nom de classe d'exception : @Transactional(rollbackForClassName="RuntimeException")Spécifiez plusieurs noms de classes d'exception : @Transactional(rollbackForClassName={"RuntimeException","Exception"})
noRollbackFor Cet attribut est utilisé pour définir un tableau de classes d'exceptions qui ne nécessitent pas de restauration. Lorsqu'une exception dans le tableau d'exceptions spécifié est levée dans la méthode, la transaction ne sera pas annulé. Par exemple : Spécifiez une seule classe d'exception : @Transactional(noRollbackFor=RuntimeException.class) Spécifiez plusieurs classes d'exception : @Transactional(noRollbackFor={RuntimeException.class, Exception.class})
Cet attribut est utilisé pour définir un tableau de noms de classes d'exceptions qui ne nécessitent pas de restauration. Lorsqu'une exception dans le tableau de noms d'exception spécifié est levée dans la méthode, la transaction est lancée. ne sera pas annulé. Par exemple : Spécifiez un seul nom de classe d'exception : @Transactional(noRollbackForClassName="RuntimeException")Spécifiez plusieurs noms de classes d'exception :@Transactional(noRollbackForClassName={"RuntimeException" , "Exception"})
propagation Cet attribut est utilisé pour définir le comportement de propagation des transactions, spécifiquement Les valeurs peuvent être trouvées dans le tableau 6-7. Par exemple : @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation Cet attribut est utilisé pour définir le niveau d'isolation des transactions de la base de données sous-jacente. Le niveau d'isolation des transactions est utilisé pour gérer la concurrence multi-transactions. L'isolement par défaut de la base de données est généralement utilisé. Le niveau est suffisant, pas besoin de le configurer
timeout Cet attribut est utilisé pour définir le délai d'expiration de la transaction. Nombre de secondes, la valeur par défaut est -1, ce qui signifie ne jamais expirer

 注意的几点:

1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

如下:

 @Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
 throw new Exception("注释");

 }
 @Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
 throw new RuntimeException("注释");
 }

3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 9e4580300b4ee94180ae502c8f21c1b3元素的出现 开启 了事务行为。

5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

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