开发者社区> 问答> 正文

注册时使用spring声明式事务管理? 400 报错

注册时使用spring声明式事务管理? 400 报错 一个注册功能
想测试一下如果用户名已经存在,再去注册时,怎么处理?我的想法是,用户名相同肯定会抛一个异常。只要捕获他。
下面是具体的思路:
Action去调用UserService(声明式事务)的regist() ----> 调用 UserDao的save方法。
让save()声明时 throws一个Exception,然后我在service层catch住这个异常,在catch里面封装了一个Result对象
设置一个错误码,最后把这个Result返回给Action层,显示给表现层


但是出错了。错误信息如下:
Messages:
Transaction rolled back because it has been marked as rollback-only
File: org/springframework/transaction/support/AbstractPlatformTransactionManager.java
Line number: 717


Stacktraces
org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only


看到网上的解释是,save方法抛出异常后,return时,spring会把Transactional标记为Rollback only,而regist捕捉了这个异常,所以事务会提交。
但是他们是在一个事务中,所以提交时,将会抛出UnexpectedRollbackException




后来,我是在regist里面先去调isUserNameExist(String username)看用户名是不是存在。如果存在直接返回设置了错误参数的Result。可是这样就要查两次数据库,是不是不好?
之前的思路对不对?
还有七种事务传播行为,怎么灵活运用,能不能随便举个例子。谢谢

展开
收起
爱吃鱼的程序员 2020-06-02 17:19:04 754 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
    ######

    先不说其他问题,只说关于Spring里的事物回滚。

    Spring里,如果同一个事务里其中一个模块(被事务管理的方法)发生了异常,并且达到回滚条件。那么Spring就会忽略后面的事务操作。无论如何都会让该事务失败。

    其实我很奇怪,如果你正确声明事务在Service层的话,Dao层的异常应该是不会触发这个的。

    你还是仔细看看你的代码吧.

    ######你的问题出在了你在service捕获了异常,你应该在service继续抛出异常让action去处理就行了。你直接在service吃掉了异常spring捕获不到了所以就认为你方法没问题就提交了,一般这种情况自定义一个异常类比较好######自定义异常可以自定义异常类的构造函数,而原生的异常类没有构造错误码的方法,比如构造函数接收一个编号,比如0000,0001,然后再创建一个与编码对应的错误信息,有异常抛出编码,需要显示中文信息的地方通过这个映射类直接get错误码,这样可以无限扩展,######对啊。一般前辈都喜欢自定义异常,这个跟直接用java带的有什么方便之处吗
    2020-06-02 17:19:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载