事务的浸染,使我们操纵可以或许连贯起来。而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>一共有四个属性如下,
@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 可选的限定描写符,指定利用的事务打点器