注册功能使用spring的声明式事务

dongcx1234567 2014-11-25 11:23:40
一个注册功能
想测试一下如果用户名已经存在,再去注册时,怎么处理?我的想法是,用户名相同肯定会抛一个异常。只要捕获他。
下面是具体的思路:
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。可是这样就要查两次数据库
之前的思路对不对?
还有七种事务传播行为,怎么灵活运用,随便举个例子
...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongcx1234567 2014-11-29
  • 打赏
  • 举报
回复
引用 6 楼 wanghualeilei 的回复:
[quote=引用 3 楼 dongcx1234567 的回复:] [quote=引用 2 楼 zhangjihao 的回复:] 还是事前查询一次吧,既然用户名唯一性,说明该字段已建立索引了,查询一次耗不了多大性能的。 用Exception来判断用户存在,编程不严谨。Dao抛出的异常很难确定类型,例如网络不稳定导致或数据库服务故障带来的连接Exception、超时Exception,事务回滚Exception等等,都归咎于用户名已存在?
有道理。。 [/quote] 如果在ajax查询注册用户不存在 返回之后 再次提交的这个时间里 其他用户注册了该名字 怎么办[/quote] 我觉得,ajax查询用户名是不是存在,还可以在注册方法里,再查一次。然后提交。注册方法是一个事务。这样应该不会有错吧??
wanghualeilei 2014-11-27
  • 打赏
  • 举报
回复
引用 3 楼 dongcx1234567 的回复:
[quote=引用 2 楼 zhangjihao 的回复:] 还是事前查询一次吧,既然用户名唯一性,说明该字段已建立索引了,查询一次耗不了多大性能的。 用Exception来判断用户存在,编程不严谨。Dao抛出的异常很难确定类型,例如网络不稳定导致或数据库服务故障带来的连接Exception、超时Exception,事务回滚Exception等等,都归咎于用户名已存在?
有道理。。 [/quote] 如果在ajax查询注册用户不存在 返回之后 再次提交的这个时间里 其他用户注册了该名字 怎么办
dongcx1234567 2014-11-26
  • 打赏
  • 举报
回复
引用 1 楼 u014631034 的回复:
注册时发ajax请求进行判断 根据你要注册的用户名去查询数据是否存在啊
在regist()方法里,可以
引用 1 楼 u014631034 的回复:
注册时发ajax请求进行判断 根据你要注册的用户名去查询数据是否存在啊
在regist()方法里事先查一次吗?
dongcx1234567 2014-11-26
  • 打赏
  • 举报
回复
引用 2 楼 zhangjihao 的回复:
还是事前查询一次吧,既然用户名唯一性,说明该字段已建立索引了,查询一次耗不了多大性能的。 用Exception来判断用户存在,编程不严谨。Dao抛出的异常很难确定类型,例如网络不稳定导致或数据库服务故障带来的连接Exception、超时Exception,事务回滚Exception等等,都归咎于用户名已存在?
有道理。。
dongcx1234567 2014-11-26
  • 打赏
  • 举报
回复
引用 4 楼 dongcx1234567 的回复:
[quote=引用 1 楼 u014631034 的回复:] 注册时发ajax请求进行判断 根据你要注册的用户名去查询数据是否存在啊
在regist()方法里,可以
引用 1 楼 u014631034 的回复:
注册时发ajax请求进行判断 根据你要注册的用户名去查询数据是否存在啊
在regist()方法里事先查一次吗? [/quote] 问错了。重来。 。我用struts和ajax时,Action里要有一个InputStream对象,显示我比如用ajax要查询多个功能,是一个InputStream对象就够还是要多个???
howsun_zh 2014-11-25
  • 打赏
  • 举报
回复
还是事前查询一次吧,既然用户名唯一性,说明该字段已建立索引了,查询一次耗不了多大性能的。 用Exception来判断用户存在,编程不严谨。Dao抛出的异常很难确定类型,例如网络不稳定导致或数据库服务故障带来的连接Exception、超时Exception,事务回滚Exception等等,都归咎于用户名已存在?
  • 打赏
  • 举报
回复
注册时发ajax请求进行判断 根据你要注册的用户名去查询数据是否存在啊

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧