@Transactional注解使用

spring事务管理 有编程式和声明式,其中声明式的一种方式可以采用全注解 @Transactional进行。

这种方式符合无嵌入式的侵入,比较方法灵活。

0、demo里面 采用了全注解方式 主要为了测试3的情况

        <!-- 自动扫描 -->
<context:component-scan base-package="com.duoduo" />
<context:annotation-config/>

<tx:annotation-driven transaction-manager="transactionManager"/>

  • mode:指定Spring事务管理框架创建通知bean的方式。可用的值有proxy和aspectj。前者是默认值,表示通知对象是个JDK代理;后者表示Spring AOP会使用AspectJ创建代理
  • proxy-target-class:如果为true,Spring将创建子类来代理业务类;如果为false,则使用基于接口的代理。(如果使用子类代理,需要在类路径中添加CGLib.jar类库)
  • order:如果业务类除事务切面外,还需要织入其他的切面,通过该属性可以控制事务切面在目标连接点的织入顺序。
  • transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会使用该引用
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>


<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>


<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/duoduo/mapping/*.xml"></property>
</bean>


<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.duoduo.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>


<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />

</bean>

1、该注解可以作用在类、方法,接口及接口方法上面

        当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义

2、@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。

3、默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

4、@Transactional的属性

  • isolation 枚举org.springframework.transaction.annotation.Isolation的值 事务隔离级别
  • noRollbackFor Class<? extends Throwable>[] 一组异常类,遇到时不回滚。默认为{}
  • noRollbackForClassName Stirng[] 一组异常类名,遇到时不回滚,默认为{}

  • propagation 枚举org.springframework.transaction.annotation.Propagation的值 事务传播行为

  • readOnly boolean 事务读写性

  • rollbackFor Class<? extends Throwable>[] 一组异常类,遇到时回滚

  • rollbackForClassName Stirng[] 一组异常类名,遇到时回滚

  • timeout int 超时时间,以秒为单位

  • value String 可选的限定描述符,指定使用的事务管理器

附录项目测试demo:

猜你喜欢

转载自blog.csdn.net/u011220648/article/details/80810651