@Transactional,,抛异常后不会滚??求解

TommyWu01 2013-07-18 06:54:26

在service层使用了@Transactional(rollbackFor=Exception.class) ,

在某个方法中故意报异常后,居然不回顾,为什么?


@Service
@Transactional(rollbackFor=Exception.class)
public class UserBaseServiceImpl implements IUserBaseService {

@Autowired
private GenericDao<UserBase, String> userBaseDao;
@Autowired
private GenericDao<UserPosition, String> userPositionDao;
@Autowired
private GenericDao<UserInfo, Integer> userInfoDao;

/**
* 数组越界异常后,数据不回顾,why?
* @param Password
* @param userName
* @param imei
*/
@Override
public void registerTest(String Password, String userName, String imei) {

try {
//此处省略若干代码,如下代码运行正常
//..................
userBaseDao.save(entity);
//.................
userInfoDao.save(entity);
//.................
userPositionDao.save(entity);

//以下为异常代码,数组越界!
String [] str=new String[]{"11"};
System.out.println(str[2]);


} catch (Exception e) {
e.printStackTrace();
}

}
}

...全文
3605 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂的球球球 2015-08-18
  • 打赏
  • 举报
回复
注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
awoshiwo 2014-09-11
  • 打赏
  • 举报
回复
在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。 Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked 如果遇到checked意外就不回滚。 如何改变默认规则: 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
_hysx 2014-08-21
  • 打赏
  • 举报
回复
在方法上添加 throws Exception ,将方法中出现的异常抛出给spring事务,去掉方法体中的try catch或者catch (Exception e) { throw e;}继续向上抛,目的是让spring事务捕获这个异常,只用spring事务捕获到Exception异常后,@Transactional(rollbackFor=Exception.class),才会起到应有的左右;catch (Exception e) { e.printStackTrace(); }这句是捕获try中出现的Exception然后讲异常信息打印出来,仅仅是打印出来,然后什么也没干
TommyWu01 2013-07-19
  • 打赏
  • 举报
回复
引用 6 楼 ch656409110 的回复:
还真是,对于运行时异常,不会回滚。 所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception
确实是这样的
TommyWu01 2013-07-19
  • 打赏
  • 举报
回复
引用 7 楼 justsmilence 的回复:
[quote=引用 6 楼 ch656409110 的回复:] 还真是,对于运行时异常,不会回滚。 所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception
+10086 异常不要捕获..[/quote] 抛出RuntimeException异常,试了下会回滚,那只要抛出RuntimeException异常就行了吗?
TommyWu01 2013-07-19
  • 打赏
  • 举报
回复
引用 3 楼 shxt_xiaozhi 的回复:
RuntimeException
在 catch 里面抛出RuntimeException的话,会回滚
  • 打赏
  • 举报
回复
引用 6 楼 ch656409110 的回复:
还真是,对于运行时异常,不会回滚。 所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception
+10086 异常不要捕获..
  • 打赏
  • 举报
回复
还真是,对于运行时异常,不会回滚。 所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception
xiaoboey 2013-07-19
  • 打赏
  • 举报
回复
就是异常捕获的问题,你自己把异常截留了,又没处理回滚,框架根本就不知道,就正常提交了
okafor2011 2013-07-19
  • 打赏
  • 举报
回复
你捕捉了,怎么会回滚呢
且活且珍惜 2013-07-19
  • 打赏
  • 举报
回复
RuntimeException
  • 打赏
  • 举报
回复
你试试不捕获呢?
XX的小石头 2013-07-18
  • 打赏
  • 举报
回复
回滚好像是针对一些特定异常的 参考:http://blog.sina.com.cn/s/blog_6ac4c6cb01018pbl.html

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧