请教大家:dao层也就是数据库操作异常由上层处理,dao层不处理异常。使用spring aop管理事务,对service层进行代理,异常就回滚,然后数据库异常集中到controller中处理 ,这样理解对吗
这个问题首先涉及到工程中代码结构的问题,正常来说会分成以下四层, 从低向上依次是:
dao层: 存放的是对底层数据库的操作
service层: 对底层的封装, 比如对dao层的封装, 对外围接口的封装等
biz层: 即业务层, 该层存放的是业务逻辑类
controller层: 及入口层, 该层负责对请求参数进行校验, 调用biz层处理业务逻辑, 然后对结果进行组装。
弄清楚了代码结构后再说一下异常处理原则: 能处理就早处理
基于楼主的例子, db异常应该是在service层被spring aop事务管理器捕获了, 即就是说@Transactional应该放在service层的方法上。另外, 一旦回滚事务管理器还会抛出数据库回滚异常, 接着biz层就要捕获这个异常来判定db操作是否成功,进而执行不同的逻辑处理。
spring 的回滚触发条件就是异常,dao也好,service也好,只要抛出了异常,就抛给controller层捕获处理1.确定什么异常需要回滚 -> DB插入失败(违背约束等) 一般都需要回滚 -> 业务异常 可以自己决定是否回滚,抛出不同类型的异常
2.确定回滚的边界,你一个操作的失败需要回滚多少对DB的操作,这个和你代码的结构有关,如果你业务全集中在Controller,就可能需要把边界加载到C层,否则可以考虑加载到S层,甚至你可以考虑加载到一个S层下方的Support层
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。