注册功能使用spring的声明式事务
一个注册功能
想测试一下如果用户名已经存在,再去注册时,怎么处理?我的想法是,用户名相同肯定会抛一个异常。只要捕获他。
下面是具体的思路:
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。可是这样就要查两次数据库
之前的思路对不对?
还有七种事务传播行为,怎么灵活运用,随便举个例子