全局的异常处理要放在@controller层抛出,不能捕获
数据库的事务一定要放在@service层
1,基于注解声明式事务
<!-- 设定transactionManager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
@Override
@Transactional(rollbackFor=Exception.class)//标记回滚方式(默认是runningTimeException,)
public int updateUser(String myRole, OpmUser user, int flag) throws Exception {
// TODO Auto-generated method stub
if(user.getId()!=null&&!"".equals(user.getId())){
flag= updateOpmUser(user);
}else{
String psd= PasswordMD5.createEncryptPSW("123");
user.setPassword(psd);
insertUser(user);
if(!"".equals(myRole)&&myRole!=null){
OpmUserRole ur = new OpmUserRole();
ur.setRoleid(myRole);
//ur.setUserid(user.getId());//mybatis的通用mapper会自动插入返回主键
flag=opmUserRoleMapper.insert(ur);//这里用户id为空插入异常
}
}
return flag;
}
2,基于《tx》声明标签声明式事务
面向切面也要声明是那种异常事务回滚