欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

如果你在 protected、private 或者默 图纸加密 认可见性的方法上使用 @Transactional 注解

点击: 次  来源:宝鼎软件 时间:2017-09-26

原文出处: 等你回去来

事务的浸染,使我们操纵可以或许连贯起来。而spring则是提供了一个更简朴的要领,只要利用 @Transactional 一个注解,就可以担保操纵的连贯性了。

普通用法,稍后再说,这里要说的是: 在最外面的要领中,有一个@Transactional 的注解,劳务派遣管理系统,当有抛出异常时,则举办回滚操纵:

@Transactional(readOnly = false, rollbackFor = Throwable.class, isolation = Isolation.REPEATABLE_READ)

原本这个要领运行得好好的,可是有一天,我们需要在这个要领里添加一个新业务操纵,并且这个业务操纵是不要求回滚的,雷同于做日志记录一类的。WHAT SHOULD I DO ?

由于业务的奇特性,我可以或许快速想到的是,在这个类内里加一个private要领,然后直接去挪用就ok了,假如说照旧思量到回滚的话,我也快速想到 @Transactional 的NOT_SUPPORTED流传特性,如:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
private void doMyExJob(UserDebitCardBean userDebitCard) {
    System.out.println("do my job...");
    //do my job...
}

这看起来很公道,没短处。

然而就是运行不起来,只要外面挪用的要领一抛出异常,那么这个新要领的数据操纵将会被回滚。妈蛋,到底那边出了问题???仔细查了下资料,本来 @Transactional 注解由于道理抉择了他只能浸染于public要领中,而这里改为private,就完全被忽略无视了。OK,改呗:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void doMyExJob(UserDebitCardBean userDebitCard) {
    System.out.println("do my job...");
    //do my job...
}

感受应该好了,然而并没有。我也是醉了,这个问题,假如仔细花时间,软件开发,找道理是没有问题的,可是在要害时刻来这么一下,照旧很不爽的。 网上看到一哥们说,还必需要将要领写到另一个类中,并且要通过spring的注入方法举办挪用,才可以。好吧,那我就凭据他的来,功效真的乐成了。

//在接口中举办了界说,可以或许注入
@Override 
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void doMyExJob(UserDebitCardBean userDebitCard) {
    System.out.println("do my job...");
    //do my job...
}

总算可以了,在赶时间的时候,可以或许办理问题的,就是好要领。至此,问题办理。1. 利用public访求;2. 写在外部类中,可被挪用; 3. 利用注入的方法举办该要领的执行。

说实话,spring这种事务照旧有点不太好用的,要求太多,虽然了,有很大部门原因是我没有领略其精华。OK,下面我们来看看spring事务的讲授:

在设置文件中,劳务派遣管理系统,默认环境下,<tx:annotation-driven>会自动利用名称为transactionManager的事务打点器。所以,假如界说的事务打点器名称为transactionManager,那么就可以直接利用<tx:annotation-driven/>。如下:

<!-- 设置事务打点器 -->
<beanid="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    p:dataSource-ref="dataSource">
</bean>
 
<!-- enables scanning for @Transactional annotations -->
<tx:annotation-driven/>

<tx:annotation-driven>一共有四个属性如下,

  • mode:指定Spring事务打点框架建设通知bean的方法。可用的值有proxy和aspectj。前者是默认值,暗示通知工具是个JDK署理;后者暗示Spring AOP会利用AspectJ建设署理
  • proxy-target-class:假如为true,Spring将建设子类来署理业务类;假如为false,则利用基于接口的署理。(假如利用子类署理,需要在类路径中添加CGLib.jar类库)
  • order:假如业务类除事务切面外,还需要织入其他的切面,通过该属性可以节制事务切面在方针毗连点的织入顺序。
  • transaction-manager:指定到现有的PlatformTransaction Manager bean的引用,通知会利用该引用
  • @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 可选的限定描写符,指定利用的事务打点器