springmvc关于事务回滚疑问请教

快速开发师 发布于 2015/07/18 21:08
阅读 3K+
收藏 0

这是一个利用spring事务处理@Transactional的新增用户的方法


/* 数据库事务的隔离级别为提交读 */
@Transactional
public void createUser(String userid){
   try{
     ...数据库若干操作...
   catch(Exception ex){}
}


请问这样spring事务处理会回滚吗?因为我把方法都try{}catch(){}起来了,那么事务就应该不能回滚。

但是我突然想到一点就是commit();的操作是由事务控制的。

commit()方法执行的时候如果出异常,还是会回滚掉我try{}catch()里面执行了的部分,比如主键冲突

可能再try{}catch()里面执行的时候都没产生主键冲突,而在真正提交commit操作的时候主键冲突发生了,

这个时候就发生了回滚。

而相反的是,我们用jdbc来写事务程序的话就可以捕获住commit时的异常

try{

 ... 

   commit();

}catch(){ } 

, 而我们在spring事务方式里那样方法内部全部try{...}catch(Exception ex)意图全部捕获异常应该是错误的吧,因为还有commit 并不受我们控制,那我们该如何做呢,是放弃自动注解事务吗?

加载中
0
mynawang
mynawang
换到c层try catch不就解决了么[27]
0
风华溪
风华溪

@Transactional注解本身就是对 异常 判断来决定是否提交的。

如果你把异常在方法内部捕获了,然后又不抛出,最后还是会执行了事务的。如果可以的话,不要在方法内部捕获异常,可以在外部,最好是在Controller层进行捕获。非要在方法内部进行捕获处理的话,而又不希望事务提交而是回滚处理的话,那最好捕获完处理后再次抛出。 

w
wgyi
回复 @快速开发师 : 你说的情况不会存在事务是由数据库支持的一种特性,他保证你对数据库的所有操作是可逆的,注意是可逆,而不是你提交了和不提交一样(这里和你所设置的事务隔离级别有关,但仅限于select操作),如果存在像你说的主键冲突或者数据错误,你在事务提交之前的insert中就会收到错误,而不是commit时,真正的事务提交出错一般是因为网络连接中断或者事务执行超时
风华溪
风华溪
回复 @chris刘 : 你说的是的对的。 其实 异常在内部 Service捕获后,处理完仍然可以继续决定是自己吃掉还是继续向上抛的。Controller层只是说对于最后一层的Exception做一个汇总而已
风华溪
风华溪
过了这么久居然还有提问的。 其实后来这个问题我不想 回答 快速开发师的 原因是为 他根本不懂@Transactional 做了什么。 所以我也就懒得争论了。
superchris
superchris
忽然想到 在controller层捕获异常的话就等于是捕获全局异常了是吗!
快速开发师
快速开发师
你没明白我的意思,我是说异常捕获没有捕获住commit时的异常,而只是捕获了commit之前的异常,那我必须把commit显示地写出来再try{}catch(){}住这个异常,你敢保证commit不会出异常吗?,你明白了吗?
返回顶部
顶部