开发者社区 问答 正文

使用spring aop管理事务

请教大家:dao层也就是数据库操作异常由上层处理,dao层不处理异常。使用spring aop管理事务,对service层进行代理,异常就回滚,然后数据库异常集中到controller中处理 ,这样理解对吗

展开
收起
a123456678 2016-03-19 10:04:59 2741 分享 版权
2 条回答
写回答
取消 提交回答
  • 这个问题首先涉及到工程中代码结构的问题,正常来说会分成以下四层, 从低向上依次是:
    dao层: 存放的是对底层数据库的操作
    service层: 对底层的封装, 比如对dao层的封装, 对外围接口的封装等
    biz层: 即业务层, 该层存放的是业务逻辑类
    controller层: 及入口层, 该层负责对请求参数进行校验, 调用biz层处理业务逻辑, 然后对结果进行组装。

    弄清楚了代码结构后再说一下异常处理原则: 能处理就早处理
    基于楼主的例子, db异常应该是在service层被spring aop事务管理器捕获了, 即就是说@Transactional应该放在service层的方法上。另外, 一旦回滚事务管理器还会抛出数据库回滚异常, 接着biz层就要捕获这个异常来判定db操作是否成功,进而执行不同的逻辑处理。

    2019-07-17 19:07:27
    赞同 展开评论
  • spring 的回滚触发条件就是异常,dao也好,service也好,只要抛出了异常,就抛给controller层捕获处理1.确定什么异常需要回滚 -> DB插入失败(违背约束等) 一般都需要回滚 -> 业务异常 可以自己决定是否回滚,抛出不同类型的异常

    2.确定回滚的边界,你一个操作的失败需要回滚多少对DB的操作,这个和你代码的结构有关,如果你业务全集中在Controller,就可能需要把边界加载到C层,否则可以考虑加载到S层,甚至你可以考虑加载到一个S层下方的Support层

    2019-07-17 19:07:27
    赞同 展开评论