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

J2EE 码拜 6年前 (2015-04-12) 1061次浏览 0个评论

在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();
		}

	}
}
@Transactional,,抛异常后不会滚??求解
10分
回滚好像是针对一些特定异常的
参考:http://blog.sina.com.cn/s/blog_6ac4c6cb01018pbl.html
@Transactional,,抛异常后不会滚??求解
10分
你试试不捕获呢?
@Transactional,,抛异常后不会滚??求解
RuntimeException
@Transactional,,抛异常后不会滚??求解
10分
你捕捉了,怎么会回滚呢
@Transactional,,抛异常后不会滚??求解
10分
就是异常捕获的问题,你自己把异常截留了,又没处理回滚,框架根本就不知道,就正常提交了
@Transactional,,抛异常后不会滚??求解
还真是,对于运行时异常,不会回滚。
所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception
@Transactional,,抛异常后不会滚??求解
引用 6 楼 ch656409110 的回复:

还真是,对于运行时异常,不会回滚。
所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception

+10086 异常不要捕获..

@Transactional,,抛异常后不会滚??求解
引用 3 楼 shxt_xiaozhi 的回复:

RuntimeException

在 catch 里面抛出RuntimeException的话,会回滚

@Transactional,,抛异常后不会滚??求解
引用 7 楼 justsmilence 的回复:
Quote: 引用 6 楼 ch656409110 的回复:

还真是,对于运行时异常,不会回滚。
所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception

+10086 异常不要捕获..

抛出RuntimeException异常,试了下会回滚,那只要抛出RuntimeException异常就行了吗?

@Transactional,,抛异常后不会滚??求解
引用 6 楼 ch656409110 的回复:

还真是,对于运行时异常,不会回滚。
所以要在事务的类中抛出RuntimeException异常,而不是抛出Exception

确实是这样的

@Transactional,,抛异常后不会滚??求解
在方法上添加 throws  Exception ,将方法中出现的异常抛出给spring事务,去掉方法体中的try catch或者catch (Exception e) {  throw e;}继续向上抛,目的是让spring事务捕获这个异常,只用spring事务捕获到Exception异常后,@Transactional(rollbackFor=Exception.class),才会起到应有的左右;catch (Exception e) {            e.printStackTrace();        }这句是捕获try中出现的Exception然后讲异常信息打印出来,仅仅是打印出来,然后什么也没干
@Transactional,,抛异常后不会滚??求解
在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)

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明@Transactional,,抛异常后不会滚??求解
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!