spring mvc 註解事務不生效
spring mvc註解事務配置很簡單
下面簡短的程式碼便可以解決 註解事務不生效問題。
我是 在web.xml檔案<servlet-name>指向的首先載入的spring配置檔案中加以下註解。這樣好像不夠優雅但沒嘗試更好的方法。
<!-- (事務管理) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</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{
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")));
}