基于@Transactional的事务管理

spring提供俩种事务管理方式

1.annotation(注解)

2.xml配置(aop技术)

 

本文介绍下第一种,annotation注解的方式

一、首先,在spring的配置文件中,配置如下配置:



 

在配置文件中,配置事务管理对象,比如org.springframework.orm.hibernate4.HibernateTransactionManager,或者org.springframework.orm.jpa.JpaTransactionManager,或者org.springframework.jdbc.datasource.DataSourceTransactionManager等等(当然,这三种事务管理对象的使用场景和功能不是完全一致的)。

然后加入<tx:annotation-driven/>节点,引用该事务管理对象,之后即可在需要进行事务处理的方法使用@Transactional进行标注。

之于事务对象的属性配置,<property>,可以配置SessionFactory,可以配置dataSource等,截图中配置了SessionFactory。

 针对<tx:annotation-driven/>的说明:

配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx、mvc 等也能很直白的理解出来分别的作用。<tx:annotation-driven/> 就是支持事务注解的(@Transactional) 、<mvc:annotation-driven> 就是支持mvc注解的,说白了就是使Controller中可以使用MVC的各种注解。

首先,<tx:annotation-driven/>  会有一个属性来指定使用哪个事务管理器,如:<tx:annotation-driven transaction-manager="transactionManager" />。然后事务管理器 transactionManager 会引用 dataSource (如果我们使用JPA或Hibernate,也需要指定一个 entityManagerFactory ),dataSouce 肯定就是直接对数据库的了。

二、配置完成之后,在使用事务管理的类或者方法上使用@Transactional进行注解即可,一般需要更新数据库,保存数据库等操作的类或者方法需要进行事务注解。

如下图所示:



 三、对于注解,可以设置事务属性,比如:

@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)

根据定义,Transactional注解可以有如下的属性定义:



 Propagation。主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系。

  • Propagation.MANDATORY 。当前方法必须在已经定义的Transaction中运行,如果没有已定义的Transaction则抛出异常。
  • Propagation.NESTED 。如果没有已定义的Transaction,当前方法新开一个Transaction并在该Transaction中运行。如果存在已定义的 Transaction,当前方法在嵌套事务(Nested Transaction)中运行 — 嵌套事务中可以定义储存点,因此可以独立于外部的Transaction而进行rollback。
  • Propagation.NEVER 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction则抛出异常。
  • Propagation.NOT_SUPPORTED 。当前方法不应在Transaction中运行,如果存在已经定义的Transaction,则该Transaction暂停(挂起)直至该方法运行完毕。
  • Propagation.REQUIRED默认值 。当前方法必须在Transaction中运行。如果存在已经定义的Transaction,则该方法在已定义的Transaction中运行;如果不存在已经定义的Transaction,则该方法新开一个Transaction并在其中运行。
  • Propagation.REQUIRES_NEW 。当前方法必须在新开的Transaction中运行。如果存在已经定义的Transaction,则该已定义的Transaction暂停直至新开的Transaction执行完毕。
  • Propagation.SUPPORTS 。当前方法不需要在Transaction中运行,但如果存在已经定义的Transaction,则该方法也可以在Transaction中正常执行。


  •   

三、@Transactional标注的位置

@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承,可能会出现不启动事务的情况。所以,Spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。    

猜你喜欢

转载自jiage17.iteye.com/blog/2260182