Spring的配置文件中,事务配置如下:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<!--<tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="preCommitTaskitem" propagation="NEVER"/> <tx:method name="preStartProcess"
propagation="NEVER"/> <tx:method name="isDisplayPostNode" propagation="NEVER"/> -->
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allMethod" expression="execution(* com.student.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethod" />
</aop:config>
其中更新等操作必须开启事务,若抛出Exception,则要求事务回滚。需要注意以下两点:
1、在service中,如果Exception被try、catch处理后,则Aop将不会再进行回滚处理。
2、service中的异常不能直接抛出去,Spring的Aop不识别java.lang.Exception,需要在service中重新抛出runtineException才可触发事务回滚。代码如下:
@Service
public class StudentService {
@Autowired
StudentDao studentDao;
public Student add(Student student) throws RuntimeException {
studentDao.add(student);
studentDao.add(student);
throw new RuntimeException("1");
}
}