工作日记2017.07.26 一段有意思的代码,关于事务和测试

一段有意思的代码,关于事务和测试

Sort sort = new Sort(Direction.ASC, "id");
int offset = 0;
int limit = 50;

        Page<User>[] users = new Page[1];
        do {
            users[0] = this.userRepository.findAll(spec, new OffsetRequest(offset, limit, sort));

            //offset += users[0].getContent().size(); 使用transactionTemplate,查询的时候删除自身的数据,offset需要从0算起
            Boolean deleted = transactionTemplate.execute(new TransactionCallback<Boolean>() {
                @Override
                public Boolean doInTransaction(TransactionStatus transactionStatus) {
                    users[0].getContent().forEach(user -> {
                        input.getTags().forEach(tagId -> {
                            tagXrefRepository.deleteByUserAndTag(entId, user.getId(), tagId);
                        });
                    });
                    return true;
                }
            });

Test模块:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {UserServiceApp.class, RepositoryUtils.class})
@Transactional
public class UserManServiceTest {
    @Test
    @Rollback(false)
    public void testQueryAndCancelTagging() {
        QueryAndTaggingRequestDto request = new QueryAndTaggingRequestDto().entId(2)
                .queryAndTaggingInput(new QueryAndTaggingInputDto().platId(1)
                        .tags(Arrays.asList(10001, 10002)));
        CommonResponseDto responseDto = service.queryAndCancelTagging(request);
        assertTrue(responseDto.getSuccess());
    }
}

测试时,因为事务在对象创建时已经创建,@Transactional
propagation属性默认为Propagation.REQUIRED。其中,
TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

所以,后面的分批删除操作是在这个事务中进行操作
在线上环境,

transacionTemplate.execute(new TransactionCallback<Boolean>() {
                @Override
                public Boolean doInTransaction(TransactionStatus transactionStatus) 

TransactionCallback,顾名思义,就是事务回调然后查到TransactionCallback。这个接口中只有一个方法,doInTransaction(TransactionStatus status) ;
就是在一个事务中需要做的事情都包括这这个方法中了。
而这个doInTransaction 又传入了一个参数,这次是 TransactionStatus,顾名思义,就是事务状态。 TransactionStatus 是一个接口,

hasSavepoint() ;  
isCompleted() ;    
isNewTransaction() ;  
setRollbackOnly() ;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值