2

1 主要处理思路

1.1 思路1

事物回滚,一般抛异常,可以自己手写一个异常,根据异常判断。事物还是按照 spring 的之前的逻辑。只是,手工抛特定的异常。这样你就可以捕获这个异常给前台用户。

1.2 思路2

方法捕获异常抛出即可,记得方法定义必须抛出异常,否则框架捕获不到,声明式事物不起作用。

1.3 总结

我认为上述思路在实现上是统一的。下面给出一个用伪代码描述的例子。

MyException:
public class MyException extends RuntimeException { 
    public MyException(){
    }
}

Action中:
@Autowired
public class XAction {
    @Autowired
    private XServicexService xService;
    
    public String AddXmethod(){
        try {
            xService.addX (x); //将x存入数据库
        } catch (MyException e) {
            System.out.println("service层出异常了....");
            //其它处理,例:加上需要在前端显示的提示信息。
        }    
    }
}

xService中:
@Service
@Transactional(propagation=org.springframework.transaction.annotation.Propagation.REQUIRED)
public class XService{

    @Autowired
    private XDao xDao;
    
    public void addX (X x) throws MyException {
    
        xDao.addX(x);
        
        //人为的创建出一个异常,测试回滚在action中可以被判断。
        try {
            int a =10/0; 
        } catch (Exceptione) {
       
            //手工抛出,作用有两个,
            //1、使用spring事务增强,对事务回滚。
            //2、action中可以捕获该异常,并处理,例:在前端显示提示信息。
            throw new MyException();
        }
    }
}

例子结果说明:
1、事务增强可以通过SpringAOP进行事务增强。
2、事务发生回滚时,Action可以“判断”事务发生了回滚,并处理。

2 参考文献

http://www.jb51.net/article/3... (Spring事务管理只对出现运行期异常进行回滚改变默认方式)
http://www.cnblogs.com/0201zc...(spring 事务回滚)
http://blog.csdn.net/gaowenmi... (spring AOP的异常拦截)
http://www.cnblogs.com/zhuawa... (关于Spring事务回滚的问题)
https://www.oschina.net/quest... (spring的事务insert操作怎么判断是否执行成功了还是回滚了)
济南java技术交流群群主隐士的思路与百度用户mahl8007的思路。


楚知行
18 声望4 粉丝