spring mvc注解事务配置很简单
下面简短的代码便可以解决 注解事务不生效问题。
我是 在web.xml文件<servlet-name>指向的首先加载的spring配置文件中加以下注解。这样好像不够优雅但没尝试更好的方法。
<!-- (事务管理) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--定义注解驱动的事务 告诉spring查找上下文中所有@Transactional注解的Bean,
而不管注解用在类级别还是方法级别上,对于每个使用@Transactional的Bean <tx:annotation-driven>
会自动为它添加事务通知
**proxy-target-class 若service类实现了接口,其值要为true
**要想事务生效,必须要扫描包前定义注解驱动事务
-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<!--自动扫描注解bean -->
<context:component-scan base-package="com"/>
另外在service、controller类中都要throws Exception,例如下面
@Transactional(propagation=Propagation.REQUIRED,rollbackFor={Exception.class})
public void addSaveMoney ( BigDecimal amount,String account,DealRecord dealRecord)throws Exception{
try{
bankAccountDao.saveMoney(amount, account);
// String s = null;
// s.length();
bankAccountDao.saveOrPutMoneyLog(dealRecord);
}catch(Exception e){
throw e;
}
}
@RequestMapping(value="/saveMoney",method= RequestMethod.POST)
public ModelAndView saveMoney(HttpServletRequest request,Model model) throws Exception{
String account = request.getParameter("account");
String amountString = request.getParameter("amount");
Long amountLong = Long.valueOf(amountString);
// Long amountLong = Long.decode(amountString);
BigDecimal amount = BigDecimal.valueOf(amountLong);
Long accountid = bankAccountService.findAccountid(account);
Timestamp dealTime = TimeStampUtil.formatTimeStamp(new Timestamp(new Date().getTime()));
DealRecord dealRecord = new DealRecord(accountid, amount, DealWay.put, dealTime);
bankAccountService.addSaveMoney(amount, account,dealRecord);
return new ModelAndView(new RedirectView("../security/userInfo/"+request.getParameter("name")));
}